斐波拉契数列-演变

斐波拉契数列-演变

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值