fibonacci数列在青蛙跳台阶问题中的应用

           最近在看博客的时候,看到青蛙跳台阶的问题,当时的提示是用fibonacci数列的应用,当时没有反应过来,所以在网上搜了搜答案,http://blog.csdn.net/mzlogin/article/details/6864392找到了解答,但是经过研读之后觉得作者的思路不合理,所以自己抖胆在这里将自己的解决思路写出来,望牛人拍砖!谢谢。

问题描述:

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,请问这只青蛙跳上n级的台阶总共有多少种跳法?

问题分析:

设青蛙跳上n级台阶的跳法为f(n)种.

设Fibonacci数列的第x项值为fibo(x).

(1)当n=1时,f(n)=1

(2)当n=2时,f(n)=2

(3)当n>2时,分析可知,在跳上第n级台阶前一步,必然是在第(n-1)或(n-2)级台阶,故有f(n) = f(n-1) + f(n-2); 依此类推...

相信至此大家已经明白,fibonacci数列如何在青蛙跳台阶问题中得到应用。
但是,我想请大家注意的是,fibonacci数列是1,1,2,3,5,8,13,21......
然而本题初始化条件是1级台阶青蛙一种跳法,2级台阶青蛙两种跳法,所以这个数列不是1,1,2,3,5,8,13,21......
而是1,2,3,5,8,13,21......,即数列是从fibonacci数列的第二项开始的。这就是问题的细微之处。

既然明白了就直接上代码吧,下面是C++代码:
#include<iostream>
using namespace std;
int fibo (const int n)
{
if(n == 1 || n == 2)
{
  if(n==1)
   return 1;
  else
   return 2;     
}
    else 
    { 
        int a = 1; 
        int b = 2; 
        int tmp; 
        for(int i = 3; i <= n; ++ i) 
        { 
            tmp = a; 
            a = b; 
            b += tmp; 
        } 
        return b; 
    } 
}
递归写法 
//int fibo(const int n) 
//{ 
//    if(n == 1 || n == 2) 
//    {
//  if(n==1)
//   return 1;
//  else
//   return 2;     
//  }
//    else  
//        return fibo(n-1) + fibo(n-2); 
//} 
int main ()
{
    cout << "请输入楼梯的级数: ";      
    int n; 
    cin >> n;   
    cout << "共有 " << fibo(n) << " 种跳法." << endl; 
    system("pause");
    return EXIT_SUCCESS; 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值