递归无限循环?

Posted

技术标签:

【中文标题】递归无限循环?【英文标题】:Recursion infinite loop? 【发布时间】:2016-10-06 15:00:31 【问题描述】:

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

<?php

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


$test = test();

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

<?php

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


$test = test();

关于为什么会这样的任何想法?

【问题讨论】:

另外,您意识到设置$test = test() 什么都不做,因为test() 不会返回值,对吧? 【参考方案1】:

您想要变量的预增量而不是后增量。这将增加变量$attempt,然后将其作为参数传递给函数而不是之后。

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

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

http://php.net/manual/en/language.operators.increment.php

【讨论】:

我自己花了几分钟才看到,这不是太明显 ;-) 很高兴能提供帮助! 如果您有适当的调试设置(例如 xdebug)来单步调试您的代码,您可以轻松发现此类问题。 我同意@georaldc ...使用xdebug,您可以观察变量值随着每个循环的变化,并非常清楚地看到代码中发生了什么。这是一个非常有价值的工具,我建议您尽快弄清楚如何使用它。设置它可能会遇到挑战,但值得让您更轻松地调试代码。【参考方案2】:

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

test($attempt++);

等于:

test($attempt);
$attempt = $attempt  + 1

【讨论】:

以上是关于递归无限循环?的主要内容,如果未能解决你的问题,请参考以下文章

递归无限循环?

方法结束前的递归不是无限循环?

JavaScript setTimeout 无递归无限循环

超过了 Django 最大递归深度。无限查看循环

javascript 在 Javascript 中进入无限循环和递归调用时如何调试它?

使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)