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