1、背景
\qquad 最近在看《剑指offer(第二版)》时,Fibonacci数列一节中提到了青蛙跳台阶的进阶版,问题描述为:一只青蛙一次可以跳上1级台阶,2级台阶…,也可以跳上n级台阶,问青蛙跳上n级台阶共有多少中跳法?书中提到了用数学归纳法可以证明跳的方法有 f ( n ) = 2 n − 1 f(n)=2^{n-1} f(n)=2n−1种,本人杠精非要运用高中知识给其证明一下子,然后再给出求解代码。
2、简单的数学归纳法证明
\qquad
其实这东西证明很简单,只是大家可能忘记高中的知识了,下面给出数学归纳法证明。首先分析一下跳上n级台阶的方法数
f
(
n
)
f(n)
f(n)的表达式应该为:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)
f(n)=f(n−1)+f(n−2)+...+f(1)+f(0)
\qquad
简要分析一下上式:因为青蛙如果先跳1级台阶,则剩余跳法为
f
(
n
−
1
)
f(n-1)
f(n−1);若先跳2级台阶,则剩余跳法为
f
(
n
−
2
)
f(n-2)
f(n−2);以此类推,到先跳n级台阶,则剩余跳法为
f
(
0
)
f(0)
f(0),注意一下此处
f
(
0
)
=
=
f
(
1
)
=
=
1
f(0)==f(1)==1
f(0)==f(1)==1。
\qquad
获得上式之后就可以开始推导了,首先进行移项处理:
f
(
n
)
−
f
(
n
−
1
)
=
f
(
n
−
2
)
+
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n)-f(n-1)=f(n-2)+...+f(1)+f(0)
f(n)−f(n−1)=f(n−2)+...+f(1)+f(0)
\qquad
然后我们可以惊奇的发现等号右端项就是
f
(
n
−
1
)
f(n-1)
f(n−1),因此我们可以得到下式:
f
(
n
)
−
f
(
n
−
1
)
=
f
(
n
−
1
)
→
f
(
n
)
=
2
∗
f
(
n
−
1
)
f(n)-f(n-1)=f(n-1)→f(n)=2*f(n-1)
f(n)−f(n−1)=f(n−1)→f(n)=2∗f(n−1),然后下面就可以开始高中数学题了,嘿嘿嘿。
f
(
n
)
=
2
∗
f
(
n
−
1
)
f
(
n
−
1
)
=
2
∗
f
(
n
−
2
)
f
(
n
−
2
)
=
2
∗
f
(
n
−
3
)
.
.
.
.
.
.
f
(
2
)
=
2
∗
f
(
1
)
f
(
1
)
=
1
∗
f
(
0
)
f(n)=2*f(n-1)\\f(n-1)=2*f(n-2)\\f(n-2)=2*f(n-3)\\...\\...\\f(2)=2*f(1)\\f(1)=1*f(0)
f(n)=2∗f(n−1)f(n−1)=2∗f(n−2)f(n−2)=2∗f(n−3)......f(2)=2∗f(1)f(1)=1∗f(0)
\qquad
到这里可能大家就明白了,把所有的等式进行累乘,之后因为
f
(
0
)
=
=
f
(
1
)
=
=
1
f(0)==f(1)==1
f(0)==f(1)==1,所以只有
n
−
1
n-1
n−1个2相乘,最终得到:
f
(
n
)
=
2
n
−
1
f(n)=2^{n-1}
f(n)=2n−1
3、求解代码
\qquad 就是把上述表达式进行代码化就行咯,有点侮辱智商的意思。
long long FrogJump(int n)
{
return (long long)pow(2, n-1);
}