递归快还是循环(迭代)快?

1.算法抽象上所谓的循环(更准确点说,叫做迭代——顺便,C艹有的是“迭代语句”而不是“循环语句”)是递归的特例。写成循环的东西能直接转写成递归形式,反过来就得自己造活动记录了(例如栈)。
2.递归调用需要维护活动记录,而迭代直接复用了存储,可以省略这些开销,所以体系结构若执行显式递归调用一般更慢。但这里一般也不会慢多少,主要还是存储空间有压力(调用栈溢出)。
3.但递归是递归,因为as-if rule,实现可以优化掉(最显著的,对符合尾递归形式的代码进行尾调用优化(TCO))不见得就会生成递归调用的代码,所以未必更慢。只不过C艹不像Scheme这样的语言强制要求TCO并且可以关掉优化所以比较容易体现。

 

顺便,不懂as-if rule的请猛戳这里:http://stackoverflow.com/questions/15718262/what-exactly-is-the-as-if-rule

 

posted @ 2014-08-18 09:49  foo__hack  阅读(2585)  评论(2编辑  收藏  举报