实验结果:
事实证明,
尾递归在php中是没有任何优化效果的!
C中的尾递归
在C中的尾递归优化是gcc编译器做的。在gcc编译的时候加上-O2会对尾递归进行优化
我们可以直接看生成的汇编代码:
(使用gdb, gcc –O2 factorial.c –o factorial; disass factorial)
未加-O2生成的汇编:
加了O2优化的汇编:
不要头大,我也是初看汇编,但是这份代码非常简单,去网上稍微搜搜命令,大致就能理解:
复制代码 代码如下:
function factoral(n, sum) {
while(n != 0){
sum = n * sum
n = n-1
}
return sum
}
gcc做的确实是智能优化。
如果你还有兴趣,你可以使用-O3对尾递归进行优化,并查看其中的汇编指令
-O3的优化是直接将循环展开
总结
一般的线性递归修改成为尾递归最大的优势在于减少了递归调用栈的开销。从php那个例子就明显看出来递归开销对程序的影响。但是并不是所有语言都支持尾递归的,即使支持尾递归的语言也一般是在编译阶段对尾递归进行优化,比如上例中的C语言对尾递归的优化。在使用尾递归对代码进行优化的时候,必须先了解这门语言对尾递归的支持。
http://www.bkjia.com/PHPjc/327067.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327067.htmlTechArticle这几天看到几篇关于尾递归的文章,之前对尾递归没有多大概念,所以回头研究了一下尾递归。 尾递归的概念 尾递归(Tail Recursion)的概念...