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

Мой код генерирует число Фибоначчи в рекурсивной функции с параметром ($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 ответа

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

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

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

Проблема здесь в том, что для вычисления 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
)

А вот и репл.

Это потому что рекурсия. Пожалуйста, взгляните на это решение, которое я нашел здесь, на Stackru. Возвращает массив с числами Фибоначчи. Количество, которое вы можете настроить в функции.

    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>";
Другие вопросы по тегам