最近在看博客的时候,看到青蛙跳台阶的问题,当时的提示是用fibonacci数列的应用,当时没有反应过来,所以在网上搜了搜答案,http://blog.youkuaiyun.com/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;
}