猴子第一天摘 N 個桃子,吃掉一半再多吃 1 個。第二天對剩餘桃子同樣操作。第 10 天早上只剩 1 個。求第一天摘了多少個?
設第 k 天早上剩 a_k 個。
a_10 = 1。k 天吃掉:a_k / 2 + 1,剩 a_{k+1} = a_k - (a_k/2 + 1) = a_k/2 - 1。a_k = 2 * (a_{k+1} + 1)。#include <stdio.h>
int peaches_recursive(int day) { // day: 當前天數 (1-10)
if (day == 10) return 1; // 第10天剩1個
return 2 * (peaches_recursive(day + 1) + 1);
}
int main() {
printf("第一天摘了 %d 個桃子\n", peaches_recursive(1)); // 輸出 1534
return 0;
}
int peaches_iterative(int days) {
int remaining = 1; // 第 days 天剩餘
for (int d = days - 1; d >= 1; --d) {
remaining = 2 * (remaining + 1);
}
return remaining;
}
int peaches_general(int n, int m) { // n天,第n天剩m個
int rem = m;
for (int d = n - 1; d >= 1; --d) rem = 2 * (rem + 1);
return rem;
}
遞推公式:a_k = 2*a_{k+1} + 2,特徵方程 x = 2x + 2 解得通項:
a_k = 3 * 2^{10-k} - 2。驗證:k=10 → 3*1-2=1;k=1 → 3*512-2=1534。
a_k = 2*(a_{k+1} + k)。