输出递归函数的每次迭代

时间:2015-06-02 13:57:48

标签: php function fibonacci

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

谢谢:-)

    <?php

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

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

    echo fib(10);

    ?>

3 个答案:

答案 0 :(得分:0)

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

<?php

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

  echo $x . " ";

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

fib(10);

调用fib()函数并在递归调用fib()之前回显该数字。或者,如果您想要回显也是&lt; = 2的数字,可以将'echo $x . " ";'放在函数开头的'if语句'之前。

答案 1 :(得分:0)

您不能在递归函数中输出序列,因为没有遍历“序列”。递归函数种类 - 每次用较低的数字分叉,直到它达到最低数字。

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

如果在函数内部放置一个echo,并且您将函数调用视为树,则回调以后序方式遍历:

enter image description here

答案 2 :(得分:0)

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

$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";