(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?
分析:1)当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;…….
规律类似于Fibonacci数列
代码如下:
#include<iostream>
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////
//斐波那契数就是后一项是前一项加前两项:0,1,1,2,3,5,8,。。。f0=0,f1=1,fn=f(n-1)+f(n-2);
//斐波那契数列的变种就是青蛙跳台阶的问题
////////////////////////////////////////////////////////////////////////////////////////////
//方法一:使用递归
long long Fibonacci1(unsigned int n)
{
if (n == 0)
{
return 0;
}
if (n == 1)
{
return 1;
}
return Fibonacci1(n - 1) + Fibonacci1(n - 2);
}
//方法二:采用非递归的方法
long long Fibonacci2(unsigned int n)
{
int res[2] = { 0, 1 };
if (n<2)
{
return res[n];
}
long long Fib = 0;
long long PreFibOne = 1;
long long PreFinTwo = 0;
for (int i = 2; i <= n; i++)
{
Fib = PreFibOne + PreFinTwo;
PreFinTwo = PreFibOne;
PreFibOne = Fib;
}
return Fib;
}
int main()
{
unsigned int n;
cin >> n;
long long res1 = Fibonacci1(n);
cout << res1 << endl;
long long res2 = Fibonacci2(n);
cout << res2;
system("pause");
return 0;
}