递归的概念与模型设计

来源:互联网 发布:人工智能建模 编辑:程序博客网 时间:2024/06/08 08:45

        在计算机编程的道路上,决心修行时,第一个想到的起点却是递归,也许这就是编程思想的一种默契。

        递归是程序设计中一个强有力的工具,但是大多数人不会自然而然地想到递归。递归可以方便我们解决某些问题,我们需要考虑在哪些情况下使用递归。一个问题要采用递归递归方法来解决问题时,必须符合以下3个条件。

       (1)解决问题时,可以把一个问题转化成为一个新的问题,而这个新的问题的解决方法仍与原问题的解法相同,只是处理的对象不同,这些处理的对象之间是有规律的递增或递减的;

       (2)可以通过转化过程使问题得到简化;

       (3)必定要有一个明确的结束递归的条件,否则递归将会无止境地进行下去,直到耗尽系统资源。也就是说必须要有某个终止递归的条件。

        如阶乘问题,求n的阶乘(n!),可以转化为n(n-1)!;而要求n(n-1)!又可以转化为(n-1)((n-2)!;……;这里面都 有一个数乘以另一个数的阶乘问题,被处理的对象分别是n,n-1,……,是有规律的递减。但是我们不能让程序无止境地执行下去,必须给一个结束条件。该问题恰好有一个结束条件,即当n=0时,0!=1。

        有两种情况常用到递归方法:

       (1)定义是递归的。

       (2)问题的解法是递归的。

         阶乘函数的定义采用的就是递归方法。如 

                            1     ,        n=0(递归终止条件)   

                 n!={

                            n(n-1)  ,            n>0(递归步骤)


算法:

public long fact(long n){

     if(n==0) return 1;

    else return n*fact(n-1);

}

    递归模型反映一个递归问题的递归结构,例如:

    (1)f(0)=1;

    (2)f(n)=n*f(n-1)  n>0

     公式(1)给出了递归的终止条件,公式(2)给出了f(n)的值与f(n-1)的值的关系,我们把(1)式称为递归出中,(2)式称为递归体。

     一般地,一个递归模型是由递归出口和递归体两部分组成,前者确定递归到何时为止,后者确定递归的方式。

    递归出中的一般格式为:f(s(0))=m(0);(这里s(0)和m(0)为常量)

    递归体的一般格式为:f(s)=g(f(s(1)),f(s(2)),...,f(s(n)),c(1),c(2),...,c(m))(这里的s是一个递归的“大问题”,s(1),s(2),...,s(n)是递归的“小问题”,c(1),c(2),...,c(m)是若干个可以直接使用非递归方法就可以解决的问题)



0 0
原创粉丝点击