递归

递归算法采用了分而治之的思想,将复杂的问题分解为小的问题,并且这个小的问题的类型与原始问题的类型完全相同。通过分解,最终原始问题变得非常小,其解决方案显而易见,或为已知。那么对此类问题应怎样建立递归模型呢。

1,分析问题:确定问题能否分解为一个更小的问题,并且小的问题的类型和原始问题类型相同。确定该问题的循环不变式(loop invariant).

2,确定基例:当把问题分解的足够小时,即其最小问题的解决方案显而易见或者已知,即寻找到了此问题的基例。将基例作为解决问题的最小条件,由此条件而逐级回溯从而解决问题。
3,执行步骤:将一级小问题视为已知完全求解,则此原始问题的解决方案很容易确定,由此确定解决方案的执行步骤。
4,参数确定:递归函数的参数可分为四类:源因子,控制因子,接收因子和行为因子。具体问题具体分析,确定其需要的参数因子。
实例分析
hanoi塔
hanoi塔大家都已经熟知,在这里我就不多说了,直入正题。
初始状态时,所有的圆盘都在A上,目的是将A上的圆盘全部移到B上,那么将A上的n-1、n-2 个圆盘放在B上与将A上的所有的圆盘都放在B上类型相同,即可确定采用递归算法。当盘的数目为0或者为1时可确定达到基例,其无需进行操作或者将一个盘移到由A移到B上。将A盘上n-1个圆盘操作视为已完成的整体(即可一次性将其移到B或C盘)。完成原始问题的解决方案确定为,将A上n-1个圆盘移到C上,然后将A上的最后一个移到B上,然后再将C盘上的n-1个圆盘移到B上,则完成所有操作。
参数选择时把N作为源因子,‘A’ ‘B’ ‘C’作为表示操作的行为因子。则其函数表达式为:
查找数组最大项:
在数组Array中查找最大项,分解数组为两个部分,分别找出最大项然后进行比较,取最大值。当分解的数组只有一项时,则其最大值即为该唯一项,由此可确定基例。
将数组的两个部分分别视作已完成的整体(即分别取得两个部分的最大值),然后进行比较,取最大值返回。

参数选择时,把arr作为源因子,first last作为控制因子。则其函数表达式为:


折半查找法
在已排序的数组array中查找指定值,分解数组为两个部分,判断指定值位于哪个部分,然后再将指定值所在的部分数组进行分解。
当分解的数组中只含有一项时,达到基例或者只含有一项时并且与指定值不相等时为基例(因为这是一个返回值函数,当存在指定值时已经返回,不存在指定值可作为基例)。
将数组的两个部分分别视作已完成的整体(具有返回值,或找到或找不到),返回由判断可知的那部分数组。

参数选择,传递一个源因子,first last 作为控制因子,则其函数表达式为:



查找第k最小项:

这个我理解的不到位就不多说了。函数表达式为:


reference

《Data Abstraction and Problem Solving wiht c++ 》(Fourth Edition)


你可能感兴趣的:(递归)