【问题标题】:outputting each iteration of recursive function输出递归函数的每次迭代
【发布时间】:2015-08-16 08:53:43
【问题描述】:

您好,有人可以告诉我如何输出这个斐波那契数列中的每个数字,同时保持它是一个递归函数,以便显示数字序列而不是显示结束数字。

谢谢 :-)

    <?php

    function fib($x){
    if($x <= 2){
    return 1;
    }

    return fib($x-1) + fib($x-2);
    }

    echo fib(10);

    ?>

【问题讨论】:

  • 显然将 echo 放在函数内部。
  • 您应该在调用fib($x-1) 时回显每个结果。所以将它存储在一个变量中,然后回显并返回。
  • @Random 这不是真的。
  • @nl-x 我发布了一个明确表达想法的答案,这确实不完整:)

标签: php function fibonacci


【解决方案1】:

你不能在递归函数中输出序列,因为没有'序列'被遍历。递归函数类型每次都使用较小的数字进行分叉,直到达到最小的数字。

该函数将被称为指数时间。 fib(5) 函数被调用了 9 次,而 fib(10) 函数被调用了 109 次!

如果你在函数内部放置一个回显,并且你将函数调用看作一棵树,那么回显就会以后序方式遍历:

【讨论】:

    【解决方案2】:

    为避免性能泄漏,您必须存储已计算的结果。然后你只需要回应你计算的那个,然后就会按顺序来。

    $knownResults = array();
    function fib($x){
        global $knownResults;
        if($x <= 2){
            return 1;
        }
        if(!array_key_exists($x-1, $knownResults)) {
            $knownResults[$x-1] = fib($x-1);
            echo "fib(".($x-1).") = ".$knownResults[$x-1]."\n";
        }
    
        if(!array_key_exists($x-2, $knownResults)) {
            $knownResults[$x-2] = fib($x-2);
            echo "fib(".($x-2).") = ".$knownResults[$x-2]."\n";
        }
    
        return $knownResults[$x-1] + $knownResults[$x-2];
    }
    
    echo "result: ".fib(40)."\n";
    

    【讨论】:

      【解决方案3】:

      它只回显一个数字而不是序列中的所有数字的原因是您正在回显函数调用,而不是当函数到达序列中的一个数字时。

      <?php
      
      function fib($x){
        if($x <= 2){
          return 1;
        }
      
        echo $x . " ";
      
        return fib($x-1) + fib($x-2);
      }
      
      fib(10);
      

      在再次递归调用 fib() 之前调用 fib() 函数并回显数字。或者,如果您想回显也是 'echo $x . " ";' 放在函数开头的“if 语句”之前。

      【讨论】:

      • 感谢 A3,帮助很大。为什么现在输出“10 9 8 7 6 5 4 3 2 1 2 3 2 1 4 3 2 1 2 5 4 3 2 1 2 3 2 1 6 5 4 3 2 1 2 3 2 1 4 3 2 1 2 7 6 5 4 3 2 1 2 3 2 1 4 3 2 1 2 5 4 3 2 1 2 3 2 1 8 7 6 5 4 3 2 1 2 3 2 1 4 3 2 1 2 5 4 3 2 1 2 3 2 1 6 5 4 3 2 1 2 3 2 1 4 3 2 1 2" 而不是斐波那契数列?
      猜你喜欢
      • 2023-01-17
      • 2022-06-28
      • 1970-01-01
      • 2021-07-24
      • 2015-05-18
      • 2019-04-03
      • 2016-03-01
      • 2015-07-11
      • 1970-01-01
      相关资源
      最近更新 更多