2

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

<?php

$herpNum = 0;

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

herp();

?>

当我运行它时,结果只是一长串 1。

4

4 回答 4

4

因为 $herpNum 与函数不在同一个范围内,所以它在函数内部创建了一个新的 $herpNum,默认为 0,然后将其加 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();
于 2012-12-18T00:22:41.630 回答
3

这是因为您没有将参数传递$herpnum给函数。

<?php

$herpNum = 0;

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

herp($herpNum);

?>

那应该工作

于 2012-12-18T00:24:13.940 回答
2

问题是,每次都$herpNum被重新定义为一个局部变量的范围内被调用。这将导致递归循环,直到抛出“最大函数嵌套级别'100'达到......”错误。(当您将 php ini 值 'display_errors' 设置为 'On' 时,您可以看到错误)herp()herp()

将上面的代码更改为:

$herpNum = 0;

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

herp();

请注意, if$herpNum仅由herp()它使用可能会更好地将其声明为herp().

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

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

于 2012-12-18T00:23:49.823 回答
0

尝试 :

$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
于 2012-12-18T00:25:27.837 回答