生成斐波那契数,直到达到PHP点

时间:2018-08-05 19:29:42

标签: php recursion fibonacci

我的代码在带有参数($ n-所需数字的位置)的递归函数中生成斐波那契数。

  

这是我的代码:

<?php

class Fibonacci {

      public $cache = array(0=>0, 1=>1);
      /**
       * Generates until reaching the given position ($n) Fibonacci number.
       * @param type $n int
       * @return type array
       */
      public function memoized($n)
       {
            if (!isset($this->cache[$n])) {
                $this->cache[$n] = $this->memoized($n - 1) + $this->memoized($n - 2);
            }
            return $this->cache[$n];
       }
}

$fib = new Fibonacci();

echo $fib->memoized(8);

我想返回所有已生成的斐波那契数的数组,直到达到极限,但是如果我只使用return $this->cache;它返回数组(在数组中的某些嵌套数组中,等等),某种程度上是行不通的但不是我所需要的。

3 个答案:

答案 0 :(得分:0)

也许您想在过程结束时返回数组?

我运行了您的代码,看起来不错:

array(9) {
[0]=>    int(0)
[1]=>    int(1)
[2]=>    int(1)
[3]=>    int(2)
[4]=>    int(3)
[5]=>    int(5)
[6]=>    int(8)
[7]=>    int(13)
[8]=>    int(21)

}

这些是您想要的斐波那契数字。

如果在代码末尾添加以下内容,则将看到完整结果;即使在课堂上使用公共场所通常是个坏主意:

echo $fib->memoized(8);
var_dump($fib->cache);

答案 1 :(得分:0)

这里的问题是要计算第 n 个斐波那契数,您需要从递归函数中返回一个 number 而不是一个数组。因此,最终的呼叫者将收到一个号码。如果您想在最后返回一个数组,只需将递归函数包装在外部函数中,如下所示:

class Fibonacci {
    private $cache = [0, 1];

    public function fib($n) {
        $this->memoized($n);
        return $this->cache;
    }

    private function memoized($n) {
        if (!isset($this->cache[$n])) {
            $this->cache[$n] = $this->memoized($n - 1) + $this->memoized($n - 2);
        }

        return $this->cache[$n];
    }
}

print_r((new Fibonacci())->fib(26));

输出:

Array
(
    [0] => 0
    [1] => 1
    [2] => 1
    [3] => 2
    [4] => 3
    [5] => 5
    [6] => 8
    [7] => 13
    [8] => 21
    [9] => 34
    [10] => 55
    [11] => 89
    [12] => 144
    [13] => 233
    [14] => 377
    [15] => 610
    [16] => 987
    [17] => 1597
    [18] => 2584
    [19] => 4181
    [20] => 6765
    [21] => 10946
    [22] => 17711
    [23] => 28657
    [24] => 46368
    [25] => 75025
    [26] => 121393
)

这是repl

答案 2 :(得分:-1)

这是因为递归。请看一下我在Stackoverflow上找到的此解决方案。它返回一个带有斐波那契数的数组。您可以在功能中调整的数量。

    function fibonacci($n,$first = 0,$second = 1) {
    $fib = [$first,$second];
    for($i=1;$i<$n;$i++) {
    $fib[] = $fib[$i]+$fib[$i-1];
    }
    return $fib;
}
echo "<pre>";
print_r(fibonacci(50));
echo "</pre>";