思路
遇见题目我们可以在纸上先动手画画,把最简单的几种方式列出来,作比较,找规律。
| 台阶数n | 跳法次数 | 过程 |
| :-- | :-- | — |
| 1 | 1 | [1] |
| 2 | 2 | [1,1],[2] |
| 3 | 3 | [1,1,1],[2,1],[1,2] |
| 4 | 5 | [1,1,1,1],[2,1,1],[1,2,1],[1,1,2],[2,2] |
| 5 | 8 | [1,1,1,1,1],[2,1,1,1],[1,2,1,1],[1
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
,1,2,1],[1,1,1,2],[2,2,1],[2,1,2],[1,2,2] |
| … | … | … |
分析
按照上面表格可以从跳法次数,过程,或者两者结合找规律
1. 从跳法次数分析
- 观察表格,可以知道从n>=3时,第n个数就是前两个数的和(与斐波那契数列一样)
- 我们自己推论,当台阶数为n时,设跳法有f(n)次,如果青蛙先跳1阶,则剩下的台阶数为n-1,即剩余跳法有f(n-1)次;如果青蛙先跳2阶,则剩下的台阶数为n-2,即剩余跳法有f(n-2)次。
- 故跳法次数f(n)=f(n-1)+f(n-2),因为等号右边有两个值,故当n=1,n=2时为最后的特殊限制条件
- 下面代码为递归求法,如果想用非递归,可以将递归通项改成循环
代码1(递归)
#include <stdio.h>
int jump(int n)
{
if (n == 1)
return 1;
if (n == 2)
return 2;
return j