Fork me on GitHub

算法学习——递归1

  递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。

一般来说 ,能够用到递归解决的问题应该满足以下三个条件:

  (1)待解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题相同,只是在数量规模上会有所不同;

  (2)递归调用的次数必须是有限的;

   (3)必须有结束递归的条件来终止递归。

以下是一些用到递归的简单实例:

eg_Fibonacci数列:

int Fib(int n)
{
    if(n==1||n==2)
        return (1);
    else
        return(Fib(n-1)+Fib(n-2));
}

eg_阶乘:

int fun(int n)
{
    if(n==1)
        return (1);
    else 
        return (fun(n-1)*n);
}

eg_汉诺塔问题:

void Hanoi(int n,char X,char Y,char Z)
{
    if(n==1)
        printf("\t将第%d个盘片从%c移动到%c\n",n,X,Z);
    else 
        {
            Hanoi(n-1,X,Y,Z);
            printf("\t将第%d个盘片从%c移动到%c\n",n,X,Z);
            Hanoi(n-1,Y,X,Z);
        }
}

递归一定程度上精简了代码,可将复杂的问题转换得很简单,但同样地,它让程序的效率变得低下(特别是在数据量大的时候)。

不管怎样,递归在算法中占有及其重要的地位,很多排序中用到它,例如快速排序,归并排序等等常见问题……

 

posted @ 2016-03-01 23:45  Vicebery  阅读(223)  评论(0编辑  收藏  举报