递归、闭合形式解(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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值