递归与分治策略(三)

分治法的基本思想

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些问题,然后将各子问题的解合并得到原问题的解,它的一般算法设计模式如下:

divide-and-conquer(P)
{
    if(|P|<=n0) adhoc(P);  
    for(i=1;i<=k;i++)//divida P into smaller subinstances P1,P2,...,PK;
        yi=divide-and-conquer(Pi);
    return merge(y1,y2,...,yk);
}

继续阅读“递归与分治策略(三)”

递归与分治策略(二)

Ackerman

在这篇文章中,我们将继续介绍递归技术中的一些例子。在上篇文章中,我们介绍了递归在阶乘和Fibonacci数列中的应用。这两个例子也可以用非递归的方式定义

n!=1×2×3×…×(n-1)×n

$$F(n)=\frac{1}{\sqrt{5}}\left [ \left ( \frac{1+\sqrt{5}}{2} \right)^{n+1}-\left ( \frac{1-\sqrt{5}}{2} \right)^{n+1} \right ]$$

但是并非一切递归函数都能用非递归方式定义。接下来将介绍一个更为复杂的递归函数,Ackerman函数。这是一个双递归函数。当一个函数以及它的一个变量由函数自身定义时,称这个函数时双递归函数。

继续阅读“递归与分治策略(二)”

递归与分治策略(一)

任何可以用计算机求解的问题所需的计算时间都与其规模大小有关。问题的规模越小,解题所需的计算机时间往往也越短,从而也比较容易处理。例如,对于n个元素的排序问题,当n=1时,不需要任何计算。n=2时,只要做一次比较即刻排好序。n=3时只要两次比较即可。但是当n变得特别大的时候,问题就不这么容易解决了。想要直接处理一个较大的问题,有时是相当困难的。

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同的问题,以便各个击破,分而治之。

如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是

继续阅读“递归与分治策略(一)”