1.递归算法实质分析
递归算法也即 “将原有问题分解为新的问题,而解决问题时又用到了原有问题的解法”。也就是,将问题层层分解为它的简化子集,而最终分解出来的问题,是一个已知解的问题。
如下图所示:
例如:求1+2+3+4+5+6+...+100,我们则可以使用递归算法计算。下面就这个例子进行分析,求1+2+...+100的和,也就是从1到100的每个数进行相加,那么我们将这个问题转化为每次两个数进行求和,如100+(99+(98+(97+(……+(1))))),可以定义为:sum=sum(n-1)+n,这样我们只需要一个循环就可以求出结果。当然,也有其他方式,在此只用来作为例题进行说明。
2.递归过程分析
2.1 第1阶段:递推。
将"原有问题"---(不断分解)--->"新的子问题",逐渐从 未知--->已知,最终达到已知条件,即递归结束条件,表明递推结束。如下图所示:
下面以求 5! (5的阶乘)为例进行说明:
5!=5x4!-----> 4!=4x3!-----> 3!=3x2!-----> 2!=2x1!-----> 1!=1x0!-----> 0!=1。
最初的5!是未知的,因为我们不知道5!等于多少。
但是我们知道 0!=1 这一特殊情况,因此我们从5!向4!、3!、2!、1!、0!进行推进,因此将 5!这一未知的问题转化为已知的 0!问题,即“递推”。
2.2 第2阶段:回归。
什么是回归?回归也即"从已知条件出发----(按递推的逆过程)---->逐一求值回来",最后到达递归开始处,结束回归阶段,完成整个递归过程。如下图所示:
我们以上述求 5! (5的阶乘)为例进行进一步说明:
(1)上述过程中我们对求5!的阶乘进行了“递推”,即:
5!=5x4!-----> 4!=4x3!-----> 3!=3x2!-----> 2!=2x1!-----> 1!=1x0!-----> 0!=1。
(2)现在,我们将5!的递推进行“回归”,如下所示:(仔细观察颜色标注哦)
5!=5x4!=5x24=120 <----- 4!=4x3!=4x6=24 <----- 3!=3x2!=3x2=6
<----- 2!=2x1!=2x1=2<----- 1!=1x0!=1x1=1<----- 0!=1。
从上面(1)、(2)结合进行分析,我们可以观察出,“递归”的过程也即“先递推再回归”,“递推”是将问题进行分解到最终已知结果,“回归”是从最终的已知结果反向回到最初的问题上,即递推的逆过程。
整个回归过程开始从0!开始求值,因为0!=1是已知的,这样每一步结果我们都是已知的,最终得出5!。
那么,如何设计5!递归算法呢?在这里只简略说明,具体应用即举例说明点击所撰写的对应文章标题链接“C++通过递归算法求n的阶乘(1.1) ”或“ 利用C++类结构的方式求n的阶乘(2)”进行深入理解和运用。
如下代码语句:
number=fac(n-1)*n ,(n>0)。
例如求 3!,则整个递推过程为:3*fac(2)--->3*(2*fac(1))--->3*(2*(1*fac(0)))--->3*(2*(1*(1))) ,因为0!=1,所以fac(0)=1。之后,则进行回归:(((1)*2)*3)=6,所以3!=3x2x1=6。
2.3 图示
根据递归算法的递推、回归两阶段,过程如下图所示:
3.小结
文字有时候是抽象的,尝试用不同形式对文字进行描述,那么可以更好的解决问题,如果感到困惑,可以再看一遍哦。
写在最后:
读两遍下来,如果仍然有不清楚的地方,可在评论区留言。
如果你有其他感到困惑的问题,欢迎在评论区留言,让我看到你的问题哦。