简单的递归函数不起作用



>我正在尝试运行递归函数,但它无法正常工作。我在代码中没有看到任何错误,所以也许这在 PHP 中是不可能的?

<?php
$herpNum = 0;
function herp() {
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }
}
herp();
?>

当我运行这个时,结果只是一个长列表 1。

因为$herpNum与函数不在同一范围内,所以它在函数内创建一个默认为 0 的新$herpNum,然后向其添加 1。

您可以将其作为参数传入,也可以将其作为全局变量传递。

$herpNum = 0;
function herp($herpNum) {
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp($herpNum);
    }
}
herp($herpNum);

$herpNum = 0;
function herp() {
    global $herpNum;
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }
}
herp();
这是因为

您没有将参数$herpnum传递到函数中。

<?php
$herpNum = 0;
function herp($herpNum) {
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp($herpNum);
    }
}
herp($herpNum);
?>

那应该有效

问题是,每次调用$herpNum时,都会在herp()范围内重新找到herp() var。这将导致递归循环,直到达到"最大函数嵌套级别'100'......" 引发错误。(当您将 php ini 值"display_errors"设置为"开"时,您可以看到错误)

将上面的代码更改为:

$herpNum = 0;
function herp() {
    global $herpNum;
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }   
}
herp();

请注意,如果 $herpNum 仅由 herp() 使用,则最好将其声明为 herp() 中的静态变量。

function herp() {
    static $herpNum = 0;
    // ...

static 关键字告诉 PHP 解释器,当第一次调用函数时,它应该只初始化变量一次。这应该完全符合您的设计需求;)

试试:

$herpNum = 0;
function herp() {
    global $herpNum;
    if ($herpNum == 22) {
        echo "done";
    } else {
        $herpNum = $herpNum+1;
        echo $herpNum."<br/>";
        herp();
    }
}
herp();

但出于安全原因,不建议这样做。

下面是一个示例:

...
if( $admin == true ) {
  echo 'yeah! You are the admin!';
}
...

如果$admin被声明为全局且未正确验证,则只需键入 http://mysite.com/?admin=true 即可使测试通过。

顺便一提。。。对于递归,最好注入"环境"(一个或多个参数)作为参数:

herp($herpNum=0); // if nothing is given, $herpNum is set to 0

最新更新