递归无限循环?

Recursion infinite loop?

提问人:CMOS 提问时间:6/7/2016 更新时间:6/7/2016 访问量:527

问:

所以我遇到了一个问题,我想出了如何解决的问题,但我很好奇为什么。所以这里有一个代码块

<?php

function test($attempt=1){
    if ($attempt == 5){
        echo "Done!";    
    }else{
        echo 'recursion!';
        test($attempt++);
    }

}
$test = test();

现在这个代码应该第一次运行,检查,进入 else 语句,然后再次运行 test,但这次使用 $attempt++,直到最终它是 == 到 5,然后它将回显完成并完成。但是,这不起作用,并且会永远循环。但是,可以通过在输入函数后立即将变量分配给另一个变量来修复它,如下所示

<?php

function test($attempt=1){
    $nextAttempt = $attempt+1;
    if ($attempt == 5){
        echo "Done!";    
    }else{
        echo 'recursion!';
        test($nextAttempt);
    }

}
$test = test();

关于为什么会这样,有什么想法吗?

PHP 递归 按引用传递

评论

0赞 Buttle Butkus 6/7/2016
另外,您意识到设置不执行任何操作,因为不会返回值,对吗?$test = test()test()

答:

1赞 Marco A. Hernandez 6/7/2016 #1

运算符 ++ 在句子计算后执行,因此您正在执行对具有相同值的函数的调用。

test($attempt++);

等同于:

test($attempt);
$attempt = $attempt  + 1
4赞 Qirel 6/7/2016 #2

您需要变量的预增增而不是后增量。这将在将变量作为参数传递给函数之前递增变量,而不是在之后递增变量。$attempt

所以基本上你想要而不是.test(++$attempt);test($attempt++);

带有工作示例的沙盒:http://sandbox.onlinephpfunctions.com/code/c50731815588d55bd079e701f1c5dde9e7148696

评论

0赞 Qirel 6/7/2016
我花了几分钟时间自己看出来,这不是太明显的东西;-)很高兴能帮上忙!
1赞 georaldc 6/7/2016
如果您有适当的调试设置(例如 xdebug)来单步执行代码,则可以轻松捕获此类问题。
0赞 Buttle Butkus 6/7/2016
我同意@georaldc......使用 XDEBUG,您可以观察变量值随每个循环的变化,并非常清楚地看到代码中发生了什么。这是一个非常有价值的工具,我建议您尽快弄清楚如何使用。设置它可能会遇到挑战,但可以让您更轻松地调试代码,这是值得的。