遞推
先看一個經典的“爬樓梯問題”,假設正在爬一個 \(n\) 階的樓梯,每次可以爬 \(1\) 階或 \(2\) 階。請問,總共有多少種不同的方法可以爬到樓頂?
例如:
- \(1\) 階樓梯:只有一種方法(爬 \(1\) 階)
- \(2\) 階樓梯:有 \(2\) 種方法(爬 \(1+1\) 階,或直接爬 \(2\) 階)
- \(3\) 階樓梯:有 \(3\) 種方法(\(1+1+1, 1+2, 2+1\))
- \(\dots\)
直接去枚舉各種方案缺乏條理,反過來思考:第 \(n\) 階怎么到的?
- 思考最后一步動作
- 要想到達第 \(n\) 階,最后一步必然只有兩種可能
- 從第 \(n-1\) 階爬 \(1\) 階上來。
- 從第 \(n-2\) 階爬 \(2\) 階上來。
- 要想到達第 \(n\) 階,最后一步必然只有兩種可能
- 建立遞推關系
- 既然到達第 \(n\) 階的方法,只能由上述兩種情況構成,那么:\(到達第n階的總方法數 = 到達第n-1階的總方法數 + 到達第n-2階的總方法數\)。
- 如果用 \(f_n\) 表示爬到第 \(n\) 階的方法數,那么就得到了一個關鍵的遞推關系:\(f_n = f_{n-1}+f_{n-2}\)。
這意味著想知道爬 \(n\) 階樓梯的方法數,只需要知道爬 \(n-1\) 階和 \(n-2\) 階的方法數,然后把它們加起來就行了。
把基本情況(\(f_1 = 1, f_2 = 2\))和遞推關系結合起來,就得到了一個完整的遞推算法。
選擇題:小明想通過走樓梯來鍛煉身體,假設從第 1 層走到第 2 層消耗 10 卡熱量,接著從第 2 層走到第 3 層消耗 20 卡熱量,再從第 3 層走到第 4 層消耗 30 卡熱量,依此類推,從第 k 層走到第 k+1 層消耗 10k 卡熱量(\(k \gt 1\))。如果小明想從第 1 層開始,通過連續向上爬樓梯消耗 1000 卡熱量,至少要爬到第幾層樓?
- A. 14
- B. 16
- C. 15
- D. 13
答案
C。
假設小明最終爬到了第 N 層,這個過程包括了從 1→2, 2→3, ..., 直到 (N-1)→N 的所有攀爬。總共消耗的熱量 C 是所有這些攀爬消耗熱量的總和 C = (10×1) + (10×2) + (10×3) + ... + (10×(N-1))。
可以將公因數 10 提取出來:C = 10 × (1 + 2 + 3 + ... + (N-1)),括號內是一個等差數列求和。根據等差數列求和公式 1+2+...+m = m(m+1)/2,其中 m = N-1,那么 C = 10 × [ (N-1) × ((N-1)+1) / 2 ] = 10 × [ (N-1) × N / 2 ] = 5 × N × (N-1)。
小明想消耗至少 1000 卡熱量,所以需要找到滿足下面不等式的最小整數 N:5 × N × (N-1) ≥ 1000,兩邊同時除以 5,得到 N × (N-1) ≥ 200,解得 N = 15。
選擇題:已知 \(f(1)=1\),且對于 \(n \ge 2\) 有 \(f(n)=f(n-1)+f(\lfloor n/2 \rfloor)\),則 \(f(4)\) 的值為?
- A. 4
- B. 5
- C. 6
- D. 7
答案
B。這是一個遞推問題,可以按照給定的公式一步步計算出結果。
\(f(2) = f(1) + f(1) = 1 + 1 = 2\)
\(f(3) = f(2) + f(1) = 2 + 1 = 3\)
\(f(4) = f(3) + f(2) = 3 + 2 = 5\)
選擇題:對于一個整數 \(n\),定義 \(f(n)\) 為 \(n\) 的各位數字之和,問使 \(f(f(x))=10\) 的最小自然數 \(x\) 是多少?
- A. 29
- B. 199
- C. 299
- D. 399
答案
B。可以把這個問題分成兩步。
第一步:找到滿足 \(f(y)=10\) 的最小自然數 \(y\)
這里的 \(y\) 實際上就是 \(f(x)\)。要找一個數 \(y\),使得它的各位數字之和為 \(10\)。為了讓 \(y\) 最小,應該遵循兩個原則:
- 位數盡可能少。
- 高位(左邊的數字)盡可能小。
一位數不可能加起來等于 \(10\),兩位數可以。要使兩位數最小,十位應該最小。十位最小是 \(1\),那么個位就是 \(10-1=9\)。因此,滿足 \(f(y)=10\) 的最小自然數 \(y\) 是 \(19\)。
第二步:找到滿足 \(f(x)=19\) 的最小自然數 \(x\)
現在知道了 \(f(x)\) 的值是 \(19\),需要找到一個數 \(x\),使得它的各位數字之和為 \(19\)。同樣,為了讓 \(x\) 最小,應該:
- 位數盡可能少。
- 高位(左邊的數字)盡可能小。
一位數不可能加起來等于 \(19\),兩位數的最大數字之和是 \(9+9=18\),不夠 \(19\)。所以 \(x\) 至少是三位數,要使三位數 \(x\) 最小,它的百位數應該最小。同理可得,這個數是 \(199\)。
選擇題:有 8 個蘋果從左到右排成一排,你要從中挑選至少一個蘋果,并且不能同時挑選相鄰的兩個蘋果,一共有多少種方案?
- A. 36
- B. 48
- C. 54
- D. 64
答案
C。
定義 \(f_n\) 為從 \(n\) 個蘋果中挑選,允許一個都不選,且不挑選相鄰蘋果的方案數。先包含“一個都不選”的方案,這樣可以使遞推關系更簡潔,最后再減去這個方案。
對于第 \(n\) 個蘋果(最右邊的一個),有兩種選擇:
- 不選第 \(n\) 個蘋果:如果不選它,那么問題就變成了“從剩下的 \(n-1\) 個蘋果中挑選”,方案數就是 \(f_{n-1}\)。
- 選第 \(n\) 個蘋果:如果選了它,根據規則,就不能選第 \(n-1\) 個蘋果。問題就變成了“從前 \(n-2\) 個蘋果中挑選”,方案數就是 \(f_{n-2}\)。
因為這兩個情況是互斥的,所以總方案數是兩者之和:\(f_n = f_{n-1} + f_{n-2}\)。
這正是斐波那契數列的遞推公式。
對于 \(f_0\),有 0 個蘋果,只有一種方案,就是“一個都不選”,所以 \(f_0 = 1\);對于 \(f_1\),有 1 個蘋果,有兩種方案,“選”或“不選”,所以 \(f_1 = 2\)。
根據遞推式可以算出 \(f_8 = 55\),這里包含了“一個蘋果都不選”這種情況。題目要求“至少挑選一個蘋果”,因此,需要從總方案數中減去“一個都不選”的那 1 種方案。

浙公網安備 33010602011771號