递归函数块的最后一个语句被执行多少次?

时间:2017-11-15 08:45:42

标签: php function recursion static static-variables

考虑以下代码片段演示递归:

<?php
  function test() {
    static $count = 0;

    $count++;
    echo $count."<br>";
    if($count < 10) {
      test();
    }
    echo "Count Value : ".$count--;
  }

  test();
?>

以上代码的输出如下:

1
2
3
4
5
6
7
8
9
10
Count Value : 10
Count Value : 9
Count Value : 8
Count Value : 7
Count Value : 6
Count Value : 5
Count Value : 4
Count Value : 3
Count Value : 2
Count Value : 1

我预计函数test()的最后一个代码语句,即echo "Count Value : ".$count--;只会在$count = 10;上if条件返回false时才执行一次,并且一切都将完成。

但出乎意料的是,随着变量$count的值减小,我执行了十次。我不明白它是怎么回事?如何在这里意外地操作代码流?

由于在if条件内进行了递归函数调用,即使在if条件失败之后,如何在 10次后调用它?

请解释一下。

注意:我没有忘记添加其他内容,但我不想要它。只需解释为什么以及如何在打印nos后才执行最后一个语句。从1到10并且仅在if条件失败之后。当if条件返回true时,它没有被执行。怎么样?

2 个答案:

答案 0 :(得分:3)

我想你忘了别的。

<?php
  function test() {
    static $count = 0;

    $count++;
    echo $count."<br>";
    if($count < 10) {
      test(); // when this call is made, all the code bellow waits for it to return
    } else {
      echo "Count Value : ".$count--;
    }
  }

  test();
?>

每次调用test()时,在if条件内,执行都会停止,直到新调用的test()返回。 test()函数仅在$count >= 10时返回。这意味着所有挂起函数调用将继续。 What is a RECURSIVE Function in PHP?

您的代码可以翻译成这样的内容;

<?php
  function test() {
    static $count = 0;

    $count++;
    echo $count."<br>";
    if($count < 10) {

      static $count = 1;

      $count++;
      echo $count."<br>";
      if($count < 10) {

        static $count = 2;

        $count++;
        echo $count."<br>";
        if($count < 10) {


          // ... the code repeats until the point when $count = 9

        } else {
          echo "Count Value : ".$count--;
        }

      } else {
        echo "Count Value : ".$count--;
      }


    } else {
      echo "Count Value : ".$count--;
    }
  }

  test();
?>

答案 1 :(得分:2)

你的代码从外面运行9次递归+ 1次,所以总共执行10次就可以了。 这是评论版:

<?php
  function test() {
    static $count = 0; // initialize only the first run

    $count++;
    echo $count."<br>"; // Current $count status
    if($count < 10) {   // goes on until 9
      test();           // This function will run before everything else
    }
    // regardless the value of $count print $count then decreases it
    echo "Count Value : ".$count--; 
    //only the other calls in the stack will see by the -- operator effect

  }
  test();
?>