一.算法思想
递归(Recurrence):计算机、数学、运筹等领域经常使用的最 强大的解决问题的方法之一,它用一种简单的方式来解决那 些用其他方法解起来可能很复杂的问题,也就是说有些问题 用递归算法来求解,则变得简单,而且容易理解。
递归的基本思想:把一个问题划分为一个或多个规模更小的 子问题,然后用同样的方法解规模更小的子问题。
二.递归算法的基本设计步骤
1.找到问题的初始条件(递归出口),即当问题规模小到某个 值时,该问题变得很简单,能够直接求解。
2.设计一个策略,用于将一个问题划分为一个或多个一步步接 近递归出口的相似的规模更小的子问题。
3.将所解决的各个小问题的解组合起来,即可得到原问题的解。
三.设计递归算法时需注意以下几个问题
1.如何使定义的问题规模逐步缩小,而且始终保持同一问题 类型?
2.每个递归求解的问题其规模如何缩小?
3.多大规模的问题可作为递归出口?
4.随着问题规模的缩小,能到达递归出口吗?
四.递归设计实例
问题一
1. 计算 f (n)=
2.考虑
计算f(3)
3.代码片段
function f(n)
if n=0 then return 1
else if n>0 then return 2*f(n-1)
end
问题二
Hanoi问题
给定三根柱子, 其中A柱子从大到小套有n个圆盘, 问题是如何借助B柱子, 将圆盘从A搬到C
和尚搬圆盘的游戏规则如下:
一次只能搬动一个圆盘;
不能将大圆盘放在小圆盘上面。
和尚们相信当解决了柱子上圆盘数为64的问题时,也就 是世界末日到来的时候!!
递归算法来求解圆盘搬动问题,其详细过程如下
(1) 将前个圆盘从A柱借助于C柱搬到B柱;
(2) 将最后一个圆盘直接从A柱搬到C柱;
(3) 将个圆盘从B柱借助于A柱搬到C柱。
伪代码片段
Hanoi(n, A, B, C)
1 if n=1 then move(1, A, C)
2 else
3 Hanoi(n-1, A, C, B)
4 move(n, A, C)
5 Hanoi(n-1, B, A, C)