青蛙跳台阶
问题描述:
一只青蛙一次可以跳一个台阶,也可以跳两个台阶。求青蛙跳上 nnn 级台阶有多少种跳法?
问题分析

跳到第二级台阶有两种跳法(即从初始位置跳两级,要么一级一级的跳)
设函数f(n)f(n)f(n)为青蛙跳台阶的种数,nnn为台阶级数,n=0n=0n=0表示青蛙在初始位置,f(0)=1f(0)=1f(0)=1。
由此可知:
f(1)=1f(1)=1f(1)=1,跳到第一级台阶只有一种跳法;
f(2)=f(0)+f(1)f(2)=f(0)+f(1)f(2)=f(0)+f(1),跳到第二级台阶要么从初始位置跳两步,要么就从第一级台阶跳一步;
f(3)=f(1)+f(2)f(3)=f(1)+f(2)f(3)=f(1)+f(2),跳到第三级台阶要么从第一级台阶跳两步,要么就从第二级台阶跳一步;
由此可以得到规律:
f(n)=f(n−2)+f(n−1)f(n)=f(n-2)+f(n-1)f(n)=f(n−2)+f(n−1),跳到第 nnn 级台阶要么从第 n−2n-2n−2 级台阶跳两步,要么就从第 n−1n-1n−1 级台阶跳一步;
f(n){1(n=1)f(n)=f(n−2)+f(n−1)(n≥2) f(n) \begin{cases} 1\quad&(n=1)\\ f(n)=f(n-2)+f(n-1)\quad&(n\geq2)\\ \end{cases} f(n){1f(n)=f(n−2)+f(n−1)(n=1)(n≥2)
其实这就是斐波那契数列,11235…n1\quad1\quad2\quad3\quad5\ldots n11235…n
解法
-
递归
int f(int n) { if (n == 0 || n == 1) return 1; else return f(n - 2) + f(n - 1); }
-
自底向上的递推
int f(int n) { int a = 1, b = 1, c; if (n == 0 || n == 1) return 1; else for (int i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return c; }
-
数学公式
转化为数学问题,其实也就是:
已知 an=an−1+an−2(n>2)a_n=a_{n-1}+a_{n-2} (n>2)an=an−1+an−2(n>2) ,a1=1a_1=1a1=1 , a2=1a_2=1a2=1 ,求 ana_nan 的通项公式。
解:构造特征方程 x2−x−1=0x^2-x-1=0x2−x−1=0 ,设α\alphaα ,β\betaβ 为方程的两个根。解得:
α=1−52\alpha=\frac{1-\sqrt{5}}{2}α=21−5 ,β=1+52\beta=\frac{1+\sqrt{5}}{2}β=21+5
根据 an=Pan−1+Qan−2a_n=Pa_{n-1}+Qa_{n-2}an=Pan−1+Qan−2 型数列的通项公式可计算 ana_nan 的通项公式:
an=(1+52)n−(1−52)n5 a_n=\frac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}} an=5(21+5)n−(21−5)n
类似 an=Pan−1+Qan−2a_n=Pa_{n-1}+Qa_{n-2}an=Pan−1+Qan−2 这样的数列,求 ana_nan 通项公式:
构造特征方程 x2−P⋅x−Q=0x^2-P \cdot x - Q = 0x2−P⋅x−Q=0,设α\alphaα ,β\betaβ 为方程的两个根
则 P=α+βP=\alpha + \betaP=α+β , Q=−α⋅βQ=- \alpha \cdot \betaQ=−α⋅β,则:
an=(α+β)an−1−αβ⋅an−2an−α⋅an−1=β⋅(an−1−α⋅an−2)an−α⋅an−1an−1−α⋅an−2=β \begin{aligned} a_n=(\alpha + \beta)&a_{n-1}-\alpha \beta \cdot a_{n-2}\\ \quad\\ a_n-\alpha \cdot a_{n-1} &= \beta \cdot (a_{n-1}-\alpha \cdot a_ {n-2})\\ \quad\\ \frac{a_n-\alpha \cdot a_{n-1}}{a_{n-1}-\alpha \cdot a_{n-2}}&=\beta\\ \end{aligned} an=(α+β)an−α⋅an−1an−1−α⋅an−2an−α⋅an−1an−1−αβ⋅an−2=β⋅(an−1−α⋅an−2)=β
即数列 {an+1−α⋅an}\{a_{n+1}-\alpha \cdot a_n\}{an+1−α⋅an} 是以 a2−α⋅a1a_2-\alpha \cdot a_1a2−α⋅a1 为首项,以 β\betaβ 为公比的等比数列,则:
an+1−α⋅an=(a2−α⋅a1)⋅βn−1an+1βn+1−αβ⋅anβn=a2−α⋅a1β2an+1βn+1+a2−α⋅a1β(α−β)=αβ[anβn+a2−α⋅a1β(α−β)] a_{n+1}-\alpha \cdot a_n = (a_2-\alpha \cdot a_1) \cdot \beta^{n-1}\\ \quad\\ \frac{a_{n+1}}{\beta^{n+1}}-\frac{\alpha}{\beta}\cdot\frac{a_n}{\beta^n}=\frac{a_2-\alpha \cdot a_1}{\beta^2} \quad\\ \quad\\ \frac{a_{n+1}}{\beta^{n+1}}+\frac{a_2-\alpha \cdot a_1}{\beta(\alpha-\beta)}=\frac{\alpha}{\beta}[\frac{a_n}{\beta^n}+\frac{a_2-\alpha \cdot a_1}{\beta(\alpha-\beta)}] an+1−α⋅an=(a2−α⋅a1)⋅βn−1βn+1an+1−βα⋅βnan=β2a2−α⋅a1βn+1an+1+β(α−β)a2−α⋅a1=βα[βnan+β(α−β)a2−α⋅a1]
即数列 {anβn+a2−α⋅a1β(α−β)}\{\frac{a_n}{\beta^n}+\frac{a_2-\alpha \cdot a_1}{\beta(\alpha-\beta)}\}{βnan+β(α−β)a2−α⋅a1} 是以 a1β+a2−α⋅a1β(α−β)\frac{a_1}{\beta}+\frac{a_2-\alpha \cdot a_1}{\beta(\alpha-\beta)}βa1+β(α−β)a2−α⋅a1 为首项,以αβ\frac{\alpha}{\beta}βα 为公比的等比数列,则:
anβn+a2−α⋅a1β(α−β)=[a1β+a2−α⋅a1β(α−β)](αβ)n−1an=a2(αn−1−βn−1)+a1(αβn−1−αn−1β)α−β \frac{a_n}{\beta^n}+\frac{a_2-\alpha \cdot a_1}{\beta(\alpha-\beta)}=[\frac{a_1}{\beta}+\frac{a_2-\alpha \cdot a_1}{\beta(\alpha-\beta)}](\frac{\alpha}{\beta})^{n-1}\\ \quad\\ a_n=\frac{a_2(\alpha^{n-1}-\beta^{n-1})+a_1(\alpha\beta^{n-1}-\alpha^{n-1}\beta)}{\alpha-\beta} \quad\\ βnan+β(α−β)a2−α⋅a1=[βa1+β(α−β)a2−α⋅a1](βα)n−1an=α−βa2(αn−1−βn−1)+a1(αβn−1−αn−1β)