青蛙走n阶台阶,它可以选择跳一阶或者跳两阶,那么他一共有多少种跳法?
我们先来简单看一下这个问题,并简单实现一下青蛙跳
1节台阶:跳1
2阶台阶:(1)跳1 跳1 (2)跳2
3阶台阶:(1)跳1跳1跳1 (2)跳1跳2 (3)跳2跳1
4阶台阶: (1)跳1跳1跳1跳1 (2)跳1跳1跳2 (3)跳1跳2跳1 (4)跳2跳1跳1 (5)跳2跳2
、、、、、、
、、、、、、
n阶台阶:
我们发现后面情况越来越多,计算也越来越复杂,但是当我仔细思考后不难发现
1、关于跳台阶问题,无论怎样上台阶,最后一步都会剩下两种情况:1.还有一步 2.还有两步;
2、而当台阶数小于二时,跳台阶的方法就等于台阶数目;
3、换个思维我们只需要将台阶数全化为两个台阶,然后考虑两个台阶的情况;
4、那我们就可以用递归的方法进行实现,递归结束的条件就为只剩下两个台阶的时候
5、可以将该问题简单看为:前面所走 + 最后一步
//我们先讨论最后一步,就非常简单,
//然后又把前面所走看为:前前面所走 + 最后一步(为到达前面所走的最后一步)
//依次进行,向后递,当台阶数小于2时,归;
代码实现如下,不考虑溢出:
#include <stdio.h> //关于跳台阶问题,无论怎样上台阶,最后一步都会剩下两种情况:1.还有一步 2.还有两步; //而当台阶数小于二时,跳台阶的方法就等于台阶数目; //换个思维我们只需要将台阶数全化为两个台阶,然后考虑两个台阶的情况; //那我们就可以用递归的方法进行实现,递归结束的条件就为只剩下两个台阶的时候; int Fib(int n) { if (n <= 2) //递归的结束条件,当还之剩下两个台阶时 { return n; } else { return Fib(n - 1) + Fib(n - 2);//两种情况,将跳台阶简单化,层层剥离, //可以将该问题简单看为:前面所走 + 最后一步 //我们先讨论最后一步,就非常简单, //然后又把前面所走看为:前前面所走 + 最后一步(为到达前面所走的最后一步) //依次进行,向后递,当台阶数小于2时,归; } } int main() { int n = 0; scanf("%d", &n); int ret = Fib(n); printf("%d\n", ret); return 0; }
以上是博主初学递归,对青蛙跳台阶问题自己的理解,若有描述不对的地方,欢迎大佬们评论区指正。