下面是全部代码,如果没有兴趣往后读可以直接自取:
//青蛙跳台阶问题
#include <stdio.h>
int jumpWays(int n) {
if (n == 1)
return 1;
if (n == 2)
return 2;
//看青蛙的第一步怎么跳
//如果跳一个台阶,则剩下 jumpWays(n - 1) 个台阶
//如果跳两个台阶,则剩下 jumpWays(n - 2) 个台阶
return jumpWays(n - 1) + jumpWays(n - 2);
}
int main() {
int n;
printf("Enter the number of steps: ");
scanf("%d", &n);
printf("Number of ways to jump: %d\n", jumpWays(n));
return 0;
}
玩法介绍:
一个青蛙一次可以跳上一级台阶,也可以跳上两级台阶。问青蛙跳上一个 n 级的台阶总共有多少种跳法。
问题解决:
对于参数为 n 的青蛙跳台阶问题,考虑它第一步跳了一格,那么剩下的就是参数为 n-1 的青蛙跳台阶问题,如果考虑它第一步跳了两格,那么剩下的就是参数为 n-2 的青蛙跳台阶问题,从而得到代码:
int jumpWays(int n) {
//看青蛙的第一步怎么跳
//如果跳一个台阶,则剩下 jumpWays(n - 1) 个台阶
//如果跳两个台阶,则剩下 jumpWays(n - 2) 个台阶
return jumpWays(n - 1) + jumpWays(n - 2);
}
接下来考虑,(n == 1)和(n == 2)的条件下用 jumpWays(n - 1) + jumpWays(n - 2); 这么写肯定是不合适的,因此额外写出,得到完整代码:
int jumpWays(int n) {
if (n == 1)
return 1;
if (n == 2)
return 2;
//看青蛙的第一步怎么跳
//如果跳一个台阶,则剩下 jumpWays(n - 1) 个台阶
//如果跳两个台阶,则剩下 jumpWays(n - 2) 个台阶
return jumpWays(n - 1) + jumpWays(n - 2);
}
这里面(n == 1)时,就只有一种情况,(n == 2)时有两种跳法。
不要去费脑筋去想运行的时候里面具体是如何嵌套以及如何执行的了,内部调用了两次自己,其计算复杂度将指数级增长,函数还没死循环,自己大脑就死循环了,况且想的那么具体对写代码也没有好处。逻辑通,不少条件,就能写好递归。
递归的灵魂是注释,自己写完代码一定不要忘记写注释,否则过几天再看代码就不知道自己为什么这么写了。