问题描述:
某人需要爬楼梯,他可以每次走1级或2级楼梯,输入楼梯的级数,求不同的走法数
例如:楼梯一共有3级,他可以每次都走1级;或者第一次走1级,第二次走2级;也可以第一次走2级,第二次走1级。一共有3种爬楼梯的方法。
输入:
输入包含若干行,每行包含一个正整数N,代表楼梯的级数,1<=N<=30
输出:
不同的走法数,每一行输入对应一行的输出
样例输入:
5
8
10
样例输出:
8
34
89
问题的分析及解决:
这题是一道递归的算法题。题目的核心难点只有一个,如何用递归思想去解决看似是排列组合的问题。
假设有N级台阶,有一个函数int Stairs(int N),可以输出N级台阶的走法。关于这N级台阶的爬楼梯方法,如果第一步走1级,那么剩下的N-1级台阶有Stairs(N-1)种走法;如果第一步走2级,那么剩下的N-2级台阶有Stairs(N-2)种走法。
即有:Stairs(N)=Stairs(N-1)+Stairs(N-2)
有么有很熟悉,斐波那契数列啊~当N=1时,有Stairs(1)=1;N=2,Stairs(2)=2 显然,这2个条件可以作为递归的终止条件,那么这个算法的代码也就轻易可以写出了
代码:
#include <iostream>
using namespace std;
int stairs(int N);
void main()
{
int N;
while (cin >> N)
{
if (N <= 0 || N >= 30)//加个条件控制,不满足条件就退出
{
cout << "Parameter Overflow";
return;
}
else
cout << stairs(N) << endl;
}
}
int stairs(int N)
{
if (N == 1)
return 1;
else if (N == 2)
return 2;
else
return (stairs(N - 1) + stairs(N - 2));
}
来源:CSDN
作者:Crazy_Tommy
链接:https://blog.csdn.net/qq_35454197/article/details/104064322