小保哥

博客园 首页 新随笔 联系 订阅 管理

尾递归,是递归吗?

递归的特征,在于“递”与“归”。

将问题拆解成相似的子问题,“递”给自己,这时,自己将中止正在解的问题,改而去解新问题。如此继续下去,直到解出第一个子问题时,开始回“归”,将该解代入到上一级问题求解,继续向上,最后求得最开始问题的解。

在这整过程中,所有未解的问题都记录在案,因为不记录的话,就是“走得太久,而忘了为什么出发”。反映到程序中,就是memory的开销。 

而尾递归,只有“递”,没有“归”。

即:自己在解某一问题时,将问题拆解成相似的子问题,“递”给自己,这时,自己将先前的问题丢弃,一心一意去解决新问题。如此继续下去,直到解出真正的解。

这有点“贪婪”,自己去体会。

从上面的解决问题的过程可以看出,新问题的求解需要能够与老问题彻底决裂,没有任何依赖,才符合尾递归的描述。

就像这样:我不知道这个问题的解,但是通过研究这个问题,我知道这个解肯定是2乘以一个与这个问题相似的子问题的解。  那么这个2就是从老问题提炼出的信息,即2和与老问题相似的子问题的组合,等价于老问题。既然是等价,求解其中任何一个,都能得出最终的解。这就是尾递归描述的过程。

所以,如果一定要说尾递归是递归,那这里的“归”也应该是“殊途同归”的意思,不是一般递归意义上的“归”。

posted on 2012-12-06 12:06  小保哥  阅读(125)  评论(0)    收藏  举报