本题由一个学弟提供,之前选拔ACM队员的练习题。
0. 题干
一只小青蛙,每次跳台阶,他可以一下跳一个台阶,或者两个台阶,问假设有n个台阶,这只青蛙一共有多种跳的方法
1. 分析解决
列出一个台阶,1种方法;两个台阶,2种方法;
3个台阶的时候,青蛙可以从第一个台阶跳上去,也可以从第二个台阶跳上去,所以等于1+2=3;
依次类推s(n)=s(n-1)+s(n-2) (n>2)
发现是一个斐波纳挈数列;
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int forge(int n){
if( n <=0)
return 0;
if (n ==1)
return 1;
if (n == 2)
return 2;
if ( n>2)
return forge(n-1)+forge(n-2);
return -1;// 避免函数找不到,编译器给warning
}
int main(){
int n;
double ret= -1;
cin>>n;
cout<<"请输入台阶数量 :"<<n;
cout<<endl;
ret=forge(n);
if (ret){
cout<< "青蛙可以跳的方法有:";
cout << ret;
cout << " 种 " << endl;
}
else{
cout<< "请重新输入正确的n值" << endl;
}
return 0;
}
运行3:

运行4:

运行10:

这个递归的时间复杂度很大,随着n值的递增,最终的结果也会很大;
可参考我的这篇数学证明:斐波那契数列重要不等式证明
本文探讨了一道经典的ACM算法题目——青蛙跳台阶问题,通过分析得出其解法与斐波那契数列的关系,并提供了一个递归算法实现。虽然该算法时间复杂度较高,但清晰地展示了斐波那契数列的应用。
1643

被折叠的 条评论
为什么被折叠?



