电脑程式中,副程式直接或间接呼叫自己就称为递回。递回算不上演算法,只是程式流程控制的一种。程式的执行流程只有两种:
1.循序,分支(回圈)
2.呼叫副程式(递回)
回圈是一种特别的分支,而递回是一种特别的副程式呼叫。
不少初学者以及教初学者的人把递回当成是复杂的演算法,其实单纯的递回只是另一种函数定义方式而已,在程式指令上非常简单。初学者为什么觉得递回很难呢?因为他跟人类的思考模式不同,电脑的两种思维模式:穷举与递回(enumeration and recursion),穷举是我们熟悉的而递回是陌生的,而递回为何重要呢?因为他是思考好的演算法的起点,例如分治与动态规划。
分治:一刀均分左右,两边各自递回,返回重逢之日,真相合并之时。
分治(Divide and Conquer) 是种运用递回的特性来设计演算法的策略。对于求某问题在输入S 的解P(S) 时,我们先将S 分割成两个子集合S 1与S 2,分别求其解P(S 1 ) 与P(S 2 ),然后再将其合并得到最后的解P(S)。要如何计算P(S 1 ) 与P(S 2 ) 呢?因为是相同问题较小的输入,所以用递回来做就可以了。分治不一定要分成两个,也可以分成多个,但多数都是分成两个。那为什么要均分呢?从下面的举例说明中会了解。
从一个非常简单例子来看:在一个阵列中如何找到最大值。回圈的思考模式是:从左往右一个一个看,永远记录着目前看到的最大值。
m = a[0];
for (i = 1 ; i < n; i++)
m = max(m, a[i]);
分治思考模式:如果我们把阵列在i的位置分成左右两段
,分别求最大值,再返回两者较大者。切在哪里呢?如果切在最后一个的位置,因为右边只剩一个无须递回,那么会是
int


484

被折叠的 条评论
为什么被折叠?



