题目来源:
描述
小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法?
输入描述:
输入包含一个整数n (1 ≤ n ≤ 30)
输出描述:
输出一个整数,即小乐乐可以走的方法数。
示例1
输入:
2输出:
2
示例2
输入:
10输出:
89
实现代码:
int Fn(int n)
{
if (n <= 2)
{
return n;
}
else
{
return Fn(n - 1) + Fn(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int sum = Fn(n);
printf("%d", sum);
return 0;
}
题目分析:
这道题其实很好理解,每次可以跳1个或者2个台阶,问要上n节台阶有多少种方法。
所以我们由简单到复杂,我们先从简单的开始分析:
当n=1时,我们很显然可以看到,只有一种方法。
当n=2时,我们也可以轻松判断,显然用2种方法,第一种是每次跳一节台阶,两次跳完,第二种方法是,第一次直接跳2节台阶。
当 n = 3时,我们也可以稍做简单分析,可以看到有3种方法。
在这3种方法中我们可以分为两类:
第一类:第一次跳一个台阶,如果第一次跳一个台阶,我们可以看到还剩两个台阶,这时候问题就转换成跳2个台阶需要多少种方法,我们刚才在n=2分析得知,有两种,因此第一类一共有2种方法。
第二类:第一次跳两个台阶,如果第一次跳2个台阶,我们可以分析得知,还剩下一个台阶,我们的问题就转换成跳1个台阶需要多少种方法,我们在n=1中分析得知,有一种,因此第二类只有1种方法。
因此,我们将这两类加起来就是我们n=3的结果,2+1 = 3,因此n= 3时,有3种方法。
当n = 4时,我们可以也可以使用n = 3的方法,将其分为两类:
第一类:第一次跳一个台阶,如果第一次跳一个台阶,我们可以看到还剩3个台阶,这时候问题就转换成跳三个台阶需要多少种方法,我们刚才在n=3分析得知,有3种,因此第一类一共有3种方法。
第二类:第一次跳两个台阶,如果第一次跳2个台阶,我们可以分析得知,还剩下2个台阶,我们的问题就转换成跳2个台阶需要多少种方法,我们在n=2中分析得知,有2种,因此第二类有2种方法。
因此,我们将这两类加起来就是我们n=4的结果,3+2 = 5,因此n= 3时,有5种方法。
那么通过这4个练习,那当n是任意数的时候,我们是不是都可以使用n=3,n=4的方法来将其分为两类,转换成代码书写的话,我们知道,使用递归,将会让其变得非常简单。
通过分析我们可以得知,当有n节台阶是,n节台阶的方法等于(n-1)+(n-2)
因此代码实现:
int Fn(int n)
{
if (n <= 2)
{
return n;
}
else
{
return Fn(n - 1) + Fn(n - 2);
}
}
我们对这段代码的所有过程进行详细的分析:
题目测试:
示例1
输入:
2输出:
2
演示结果:
示例2
输入:
10输出:
89
演示结果:
结论:
通过本题的练习,让我对递归有了又一遍复习,重要的是给我提供了一种解题思路,将一个复杂的问题转换成简单的问题,然后从简单的问题中发现规律,对一个大的复杂问题进行分类,拓宽了思维。
感兴趣的小伙伴可以独自尝试练习一下:
最后如果有小伙伴对递归这块知识又不太了解的可以访问下面这条链接:
[ C语言 ] 函数的嵌套调用--链式访问--声明--定义--递归--练习--函数(完)_小白又菜的博客-优快云博客_c 链式调用
最后,如果各位小伙伴读完之后觉得解决了问题,有所收获的话,大家可以点赞收藏+关注哦~
如果各位大佬在文中随时写错的地方及时在评论区指出哦~