青蛙跳台阶
题目
青蛙一次只能跳 1级 或 2级,求跳到第 n 级台阶一共有多少种跳法。
核心逻辑(关键:逆向思考)
想站上第 n 级台阶,最后一步只存在两种可能性,没有别的情况:
- 最后一跳跳 1级:说明在这一跳之前,青蛙已经站在第 n-1 级。前面所有到达 n-1 的走法,接上这一下跳1级,就都是到n阶的合法方案。方案数量 = 到达 n-1 的方案数。
- 最后一跳跳 2级:说明在这一跳之前,青蛙已经站在第 n-2 级。前面所有到达 n-2 的走法,接上这一下跳2级,就都是到n阶的合法方案。方案数量 = 到达 n-2 的方案数。
所有方案不会重叠、不会漏掉。
所以递推式:
f(n)=f(n-1)+f(n-2)
边界条件(基础情况,不能靠递推算,直接定义)
- f(1)=1:只有1级台阶,只能跳1次1级,1种方案
- f(2)=2:两种:①1+1 ②直接跳2级,2种方案
重点:递推式子长得一样,但初始值不一样,所以数列本身和标准斐波那契不是一回事。
标准斐波那契:F(1)=1,F(2)=1;青蛙跳:f(1)=1,f(2)=2。
两种实现思路
- 递归
c
int f(int n)
{
if(n == 1) return 1;
if(n == 2) return 2;
return f(n-1)+f(n-2);
}
缺点:不断重复计算相同的f(k),n大之后效率极低。
- 迭代(循环,推荐)
从底层从小往大一步步算,只保存最近两个值,节省空间
c
int frog(int n)
{
if(n == 1) return 1;
if(n == 2) return 2;
int b = 1; // f(n-2)
int a = 2; // f(n-1)
int c;
for(int i = 3; i <= n; i++)
{
c= a + b;
b = a;
a = c;
}
return a;
}
扩展变种:青蛙可以跳1~n任意阶
逆向推导:到n阶,最后一步可以从 n-1 / n-2 / … /0 直接跳上来
f(n)=f(n-1)+f(n-2)+…+f(1)
到n阶的全部走法 = 到n-1阶所有走法 + 到n-2阶所有走法,边界单独定死,不要直接套用斐波那契的初始条件。
如果每次跳的是偶数格,则n为奇数是都为0。
但是每次跳奇数格,就没限制。
最重要就是看原理公式和找到特殊项