8.1.1 兔子和斐波拉契数列
思路:用 fn f n 表示n个月后的兔子对数。
转化思想:当n ≥ ≥ 3的时候, fn f n 等于前一个月的对数 fn−1 f n − 1 加上新出生的兔子( fn−2 f n − 2 )。
fn f n = fn−1 f n − 1 + fn−2 f n − 2
8.1.2 汉诺塔
思路:用 fn f n 表示解n个盘子的汉诺塔问题所需要的移动次数。
转化思想:我们可以先用 fn−1 f n − 1 次移动将上边的 n−1 n − 1 个盘子移到柱c,在这些移动中保留最大的盘子不动。然后我们用一次移动将最大的盘子移到第二根柱子上面。我们可以再使用 fn−1 f n − 1 次移动将柱c上的n-1个盘子移动到柱b,把它们放在最大的盘子的上面。
fn−1 f n − 1 + fn−2 f n − 2
8.1.3 连续串
找出不含2个连续0的n位二进制串的个数。
思路:用 fn f n 表示不含2个连续0的n位二进制串的个数。
由于二进制串的最后一位必须是0和1中的一个,所以当最后一位为1的时候,转换成了不含2个连续0的 n−1 n − 1 位二进制串的个数,如果最后一位是0,那么倒数第二位必须是1,于是转换成了不含2个连续0的 n−2 n − 2 位二进制串的个数。
fn−1 f n − 1 + fn−2 f n − 2
8.1.4 编码字的枚举
背景知识:计算机把一个十进制数字串作为一个编码字,如果它包含偶数个零,那么他就是有效的,找出 n n 位有效编码字的个数。
思路:用表示 n n 位编码字的个数。
转化思想:当的时候,容易知道有9个;
我们考虑在下面两种情况:
(1)在一个 n−1 n − 1 位的有效数字串的后面加一个非零的数字就构成了n位有效的数字串,因此这种方法一共构造了 9fn−1 9 f n − 1 种;
(2)在一个 n−1 n − 1 位的无效数字串的后面加一个零就构成了n位有效的数字串,因此这种方法一共构造了 10n−1−fn−1 10 n − 1 − f n − 1 种;
结合上面两种情况,我们知道一共有 10n−1−fn−1+9fn−1 10 n − 1 − f n − 1 + 9 f n − 1 = 10n−1+8fn−1 10 n − 1 + 8 f n − 1
8.1.4 乘积中加括号规定乘法的次数的方式数
背景知识:求关于 Cn C n 的表达式,其中 Cn C n 是通过对 n+1 n + 1 个数 x1 x 1 ⋅ ⋅ x2 x 2 ⋅ ⋅ x3 x 3 ⋅ ⋅ … … ⋅ ⋅ xn x n 的乘积中加括号来规定乘法次数的方法数。
解题思路:
我们可以发现,无论我们怎样在其中加括号,用会有一个“ ⋅ ⋅ ”留在所有括号的外面,即执行最后一次乘法的运算。这个最后的运算符出现在 n+1 n + 1 个数中的两个数字之间,比如说 xk x k 和 xk+1 x k + 1 之间。当最后的运算符出现在 xk x k 和 xk+1 x k + 1 之间时,存在
Ck C k Cn−k−1 C n − k − 1 种方法插入括号来决定n+1个数被乘的次数,因为有 Ck C k 种方法在 x1 x 1 ⋅ ⋅ x2 x 2 ⋅ ⋅ x3 x 3 ⋅ ⋅ … … ⋅ ⋅ xk x k 中插入括号来决定这k+1个数字的乘法次序,所以有 Cn−k−1种方法在乘积 C n − k − 1 种 方 法 在 乘 积 xk+1 x k + 1 ⋅ ⋅ xk+2 x k + 2 ⋅ ⋅ xk+3 x k + 3 ⋅ ⋅ … … ⋅ ⋅ xn x n 来插入括号来决定这n-k个数字的乘法次序
初始条件是 C0 C 0 =1, C1 C 1 =1;