1.青蛙跳台阶问题
青蛙跳台阶问题就是关于一只青蛙再跳台阶时,一次能跳一个台阶或两个台阶,那么求出这只青蛙跳到第n个台阶有几种方法。
2.问题分析
简单分析下问题,青蛙跳一个台阶时,方法只有一种,那就是一次跳一个台阶,但是在跳两个台阶时,有跳一个台阶加一次跳1个台阶和一次挑2个台阶的方法,跳三个台阶时有1 1 1、1 2和2 1的三种跳法,由此可知,随着阶数的增加,问题会越来越复杂。
3. 列表分析
当我们遇到复杂的问题时,我们可以简单列一个表。
阶数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
方法数量 | 1 | 2 | 3 | 5 | 8 | 13 | 21 |
由表可知,青蛙跳台阶问题可以简化成一个斐波那契数列 。那为什么会是一个斐波那契数列呢?接着让我来给大家分析一下。以跳6个台阶为例,当第一次跳一个台阶时,就还剩5个台阶,那么跳6个台阶的方法数量就等于跳1个台阶的方法数量加上跳5个台阶的方法数量。当第一次跳两个台阶时,那么还剩4个台阶的数量要跳,这时,跳6个台阶的方法数量就等于跳2个台阶的方法数量加上跳4个台阶的方法数量。以此类推,当我们要跳n个台阶时,方法数量就等于跳(n-1)个台阶的方法数量加上跳1个台阶的方法数量或者等于跳2个台阶的方法数量加上(n-2)个台阶的方法数量。
4.图示
如上图所示,上面的阿拉伯数字表示跳完一次之后,剩余的台阶数量。由图可知,无论跳多少个台阶,最终都会剩下1个或2个台阶,所以当我们使用递归时,可以让这两种情况作为最终返回值,即f(1)==1和f(2)==2。
所以根据这个思路画出递归的函数图。
5.代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int jump(int a)
{
if (a == 1)
{
return 1;
}
if (a == 2)
{
return 2;
}
else
{
return jump(a - 1) + jump(a - 2);
}
}
int main()
{
int a = 0;
printf("请输入青蛙要跳的阶数:");
scanf("%d", &a);
int ret = jump(a);
printf("青蛙跳到%d有%d种方法", a, ret);
return 0;
}