PHP优化尾递归吗?

19 浏览
0 Comments

PHP优化尾递归吗?

我写了一小段代码,如果尾递归被优化的话,我相信它应该会成功,但是它导致了堆栈溢出。我应该得出结论PHP不优化尾递归了吗?\n

function sumrand($n,$sum) {
    if ($n== 0) {
        return $sum;
    }
    else {
        return (sumrand($n-1,$sum+rand(0,1)));
    }
}
echo sumrand(500000,0)."\n";

0
0 Comments

PHP并不优化尾递归。这是因为PHP是一种用C语言编写的脚本语言,所以这种限制是不可避免的。在底层的C语言中也显示出了缺乏优化的问题。你可以看到PHP并不是唯一处理这种情况不够优雅的语言。我建议使用Erlang和MyPeb PHP/Erlang桥来解决这类问题。这并不是实现工作的方式。特别是php只是字节码解释而不是线程编译为C。

0
0 Comments

PHP是否优化尾递归?

在PHP中可以调用递归函数。然而,要避免递归函数/方法调用超过100-200次递归层级,因为它可能会破坏堆栈并导致当前脚本的终止。

似乎可以认为PHP不会优化尾递归。编程语言是否有堆栈限制是很常见的问题,而且在实际上任何语言中,一个编写不良的递归函数都会遇到相同的问题。但是,尾递归改变了这一点(如果支持的话)。

关于堆栈限制,我认为答案是关于尾递归这一点的。当然,编程语言有堆栈限制,但是尾递归会被优化为非递归跳转,因此不应该耗尽堆栈。因此,事实上提到了递归深度的限制,意味着没有尾递归。

虽然这是正确的,但人们会期望上面的段落中指出尾递归的特殊情况。由于没有提到,我们可以安全地假设PHP没有针对尾递归的特殊情况。

“尾递归被优化为非递归跳转,因此不应该耗尽堆栈”,这是正确的,但并不是每个递归调用都是尾递归的。因此,“提到递归深度的限制”并不意味着编译器/解释器不优化尾递归。

0
0 Comments

PHP并没有对尾递归进行优化。

0