斐波拉契数列-演变

来源:互联网 发布:数据库管理第三版答案 编辑:程序博客网 时间:2024/05/20 21:45

斐波拉契数列-演变

面试中碰到类似的算法题有如下:
爬楼梯,从第一层到第十层,每次允许一次性爬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();     }}

运行截图,274代表从第1层爬到10层,每次只允许爬1,2,3层 后所有的步骤

0 0
原创粉丝点击