分析👏
不同的结果嘛;细想就发现我格局低了,这题其实很有意思。
那么我们先分析一下,我青蛙只能跳1或2级,一级台阶只有一种;跳二级时,可跳两次一级或跳一次二级;跳3级时,跳一个二级和一个一级,即二级台阶跳法+一级台阶跳法;跳四级时,先跳一级后,剩三级台阶;或先跳两级,剩二级台阶,可能性就是三级台阶跳法+二级台阶跳法……
规律出来后其实不难发现和我们之前研究的斐波那契似乎有些渊源,但又有不同,我暂且称它为特殊斐波那契数列,稍作对比:
斐波那契:
实现👏
知道原理和模型就不难理解问题的本质,接下来就是衔接与打磨。这里我们先自义定一个 Frog函数来模拟情景:
#include<stdio.h> int Frog(int n) { if (n == 1) { return 1; } if (n == 2) { return 2; } return Frog(n - 1) + Frog(n - 2);//大于2级台阶就进入递归部分 } int main() { int n = 0; printf("please input the number of steps:"); scanf("%d", &n); int num = Frog(n);//传参开始计算 printf("%d\n", num); return 0; }
执行结果如下图所示:(假设为6级台阶)
格局打开👏
以上只是针对的是初始步数对应为n =1或n=2时,我们继续深入思考一下,n更大时,n=3,4,5,……,m 时又该怎么办呢?当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法; 第一次跳出二阶后,后面还有Fib(n-2)中跳法…第一次跳出n阶后, 后面还有 Fib(n-n)中跳法.这时候我们可以把函数部分再补充一下如下:
#include<stdio.h> int Frog(int n,int m) { if (n == 1) { return 1; } if (n == 2) { return 2; } if (n == 3) { return 4; } …… …… if(n==m) { return ?; //(跳m级台阶方案) } Frog(n-1)+Frog(n-2)+Frog(n-3)+……+Frog(n-m); }