/** * fibonacci_series. * Uses static stack ($fs) for memoization to accelerate subsquent calls. * * @link https://en.wikipedia.org/wiki/Fibonacci_number * * @author Jitendra Adhikari <*****@*****.**> * * @param int $n The number of fibonacci to generate * * @return array The list with n fibonacci numbers * * @throws InvalidArgumentException If input is not valid number */ function fibonacci_series($n) { if (!is_numeric($n)) { throw new \InvalidArgumentException(sprintf('%s is not valid number', $n)); } static $fs = [0, 1]; if ($n < 0) { $_fs = []; foreach (fibonacci_series(-$n) as $k => $f) { $_fs[0 - $k] = $k % 2 ? $f : -$f; } ksort($_fs); return $_fs; } if (isset($fs[$n])) { return array_slice($fs, 0, $n + 1); } while (end($fs)) { $fs[] = $fs[key($fs)] + $fs[key($fs) - 1]; if (isset($fs[$n])) { return $fs; } } }
/** * @depends testFibonacciLoader * @expectedException \InvalidArgumentException */ public function testFibonacciSeriesException() { fibonacci_series('str'); }