我的代码在带有参数($ 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;
它返回数组(在数组中的某些嵌套数组中,等等),某种程度上是行不通的但不是我所需要的。
答案 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>";