递归、闭合形式解(closed form solution)

 
一、递归的意义。

我以前一直误解了递归的意义,并为自己能在程序中多写几个递归高兴。现在我发现错了!递归显然能让程序看起来非常简洁,但是,由于会引起函数的多次调用,将大大的降低程序的效率。那我们讨论递归干什么?基于以下这两个愿因:

第一,也是最重要的原因,递归告诉了我们一种思考问题的方法。因为,确实是有一些问题,如果不用递归的思想去思考,我们将束手无策!最明显的例子就是汉诺塔的问题。

但是,正如前面提到的,递归的效率并不高。因此,我可以利用递归去思考,但如果做得到的话,尽可能用循环或直接计算去替代递归,如何把递归转换为循环或直接计算,将在闭合形式解中讨论。

第二,就像不能根除goto语句一样,递归在某些时候确实没有替代品。所以,学会熟练的写出递归程序,仍是必备的能力。这里简要的说一说如何写递归的程序。

最简单的递归由两部分组成:1、初始情况(base case)。2、递归部分(recursive call)

就拿汉诺塔的问题吧(摘自Clifford A. Shaffer 的数据结构与算法 第二版):

void TOH(int n,Pole start,Pole temp)

{

   if(n == 0) return;                            //base case

   //把n-1块从start移到temp

   TOH(n-1,start,temp,goal);          //recursive call

   //把start最上面那一块移到goal

   mov(start,goal);                            //move one disk

   //把n-1块从temp移到goal

    TOH(n-1,temp,goal,start);         //recursive call

}

二、闭合形式解(closed form solution)

闭合形式解:一个能直接计算级数和或递归结果的等式。

其实,这应该属于高中的知识了。例如,已经一个递归:T(n) = T(n-1)+ n^2;

 那么根据高中的数学知识,可以解出:

T(n) = n^2  + (n-1)^2 + (n-2)^2 + ... + 2^2 + 1^2

              = (2*n^3 + 3n^2 + n)/6

这样就可以用直接计算的方法来代替递归了。效率显著提高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章