рекурсия — Генерация чисел Фибоначчи до достижения некоторой точки в переполнении стека

Мой код генерирует число Фибоначчи в рекурсивной функции с параметром ($ 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; он возвращает массив (некоторый вложенный массив в массиве в массиве … и т. д.), но не то, что мне нужно.

1

Решение

Может быть, вы хотите вернуть массив в конце процесса ???

Я запустил ваш код, и он выглядит хорошо:

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);
0

Другие решения

Проблема здесь в том, что для расчета Nчисло Фибоначчи, вы должны вернуть число а не массив из вашей рекурсивной функции. Таким образом, последний абонент получит номер. Если вы хотите вернуть массив в конце, просто оберните рекурсивную функцию во внешнюю функцию следующим образом:

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
)

И вот РЕПЛ.

0

Это потому что рекурсия. Пожалуйста, взгляните на это решение, которое я нашел здесь на 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>";
-1
По вопросам рекламы [email protected]