斐波拉契数列-演变
面试中碰到类似的算法题有如下:
爬楼梯,从第一层到第十层,每次允许一次性爬1-3层,则从第1层到第10 层总共有多少种方法,并将相应的所有步数列举出来。
解法: 设爬的层数为n,需要的总共的方法数归纳为方法f(n)
先归纳下方法:
n =1:f(1) = 1;
n=2; f(2) = 2; 1+1 2
n=3; f(3) = 4; 1+2 1+1+1 2+1 3
n=4; f(4) = 7;
1+1+1+1 1+1+2 1+2+1 2+1+1 1+3 3+1 2+2
依次类推
n=5;f(5) = 13; f(4)+f(3)+f(2)
n=6; f(6) = 24; f(5)+f(4)+f(3)
…..
类推得:
n>=4时
f(n)=f(n-1)+f(n-2)+f(n-3);
当 0
int fun(int nFloors){
if(nFloors == 1){
return 1;
}else if(nFloors == 2){
return 2;
}else if(nFloors == 3){
return 4;
}
return fun(nFloors-1)+fun(nFloors-2)+\
fun(nFloors-3);
}
已经能得出爬到第n层所需要的总方法数,接下来要处理的是如何将相应的步数列举出来
void fun1(int nSum,vector<int> vec){
if(nSum == 0){
vector<int>::iterator ite;
for(ite = vec.begin(); ite != vec.end();ite++)
{
//排除大于3的元素
if((*ite)> 3){
return ;
}
}
// 输出所有的步数
for(ite = vec.begin(); ite != vec.end();ite++)
{
cout<<" "<<(*ite);
}
}
for(int i =0; i < nSum;i++){
vec.push_back(i);
fun1(nSum-1,vec);
vec.pop_back();
}
}