Последовательность Fibonacci PHP

Этот php-метод должен печатать последовательность Фибоначчи до заданного значения, используя цикл for. Я не уверен, почему это не работает?

<?php function fib ($n) { // a function called fib, declaire variable n (the sequence number) for ($n=0;$n<30;$n++) { if ($n < 3) { return $n; } // if n is smaller than 3 return n (1 or 2) else { return fib ($n - 1) + fib ($n - 2); } /* if the number is 3 or above do 2 sums (n-1) and (n-2) and then add the 2 sums together (n-1)+(n-2) Example Fibonacci number 4 (4-1)+(4-2) = 5 3 + 2 = 5 */ } print $n; ?> 

Фактически существует способ вычисления числа Фибоначчи без итерации с помощью округления:

http://en.wikipedia.org/wiki/Fibonacci_number#Computation_by_rounding

 function getFib($n) { return round(pow((sqrt(5)+1)/2, $n) / sqrt(5)); } 

Простая функция фибоначчи

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

В этом примере я использую цикл for и ограничиваю длину до 10:

 $x = 0; $y = 1; for($i=0;$i<=10;$i++) { $z = $x + $y; echo $z."<br />"; $x=$y; $y=$z; } 

Вывод:
1
2
3
5
8
13
21
34
55
89
144

Ваше основное понимание того, как работает язык, кажется неправильным. Вы определяете функцию, но не называете ее. Вы даете параметр, который затем сразу же перезаписываете.

Попробуй это:

 $fib = [1,0]; for($i=0; $i<30; $i++) { $next = array_sum($fib); array_shift($fib); array_push($fib,$next); echo $next.", "; } 

Вы переписываете $n вы получаете как аргумент функции, когда вы позволяете $n быть счетчиком циклов.

Избавьтесь от -forate, оставьте только его тело.

Я знаю, что я опоздал на год, но вот мой вклад. Существует два возможных решения:

 function fib1($n) { return $n < 3 ? 1 : fib1($n - 1) + fib1($n - 2); } function fib2($n, $c = 2, $n2 = 0, $n1 = 1) { return $c < $n ? fib2($n, $c + 1, $n1, $n1 + $n2) : $n1 + $n2; } 

Первый из них более изящный и вычисляет результат так же, как он определен математически. Проблема в том, что это очень дорого для больших $ n.

Второй – намного быстрее, но вы должны убедиться, что пользователь устанавливает только первый параметр.

Время исполнения:

$ n = 20, fib1 = 0,092 с, fib2 = 0,001 с

$ n = 30, fib1 = 12,2827s, fib2 = 0,001s

$ n = 40, fib1 => 500s fib2 = 0,001s

 function fib($m){ $j=0;$k=1; for($i=0;$i<=$m;$i++){ $l=$k; $k=$j+$k; $j=$l; } return $k; } 
  function fibonacci( $n ) { if (( $n == 0 ) || ( $n == 1 )) { return $n; } return fibonacci( $n-2 ) + fibonacci( $n-1 );} 

Это метод, используемый мной:

 function fibonacci_series($n) { $f1 = -1; $f2 = 1; for ($i = 1; $i <= $n; $i++) { $f = $f1 + $f2; $f1 = $f2; $f2 = $f; echo "$f<br />"; } } echo fibonacci_series(5); 

Для объяснения посетите здесь

 function getFib($n, $nN, $ct = 0, $max = 100) { $ct++; echo "$nN \n"; ($ct < $max) ? getFib($nN, $n+$nN, $ct) : die(); } echo 0; getFib(0, 1); 

Рекурсивный фиб

Серия Fibonacci выглядит так:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

 function fabnacaiiSeries($num){ $first=0;$second=1; for($i=0;$i<$num;$i++){ if($i<=1){ $next=$i; } else { $next=$first+$second; $first=$second; $second=$next; } echo $next." , "; } } fabnacaiiSeries(10); 

Подробнее

Это неэффективное fib ($ n – 1) + fib ($ n – 2); вот мои решения с рекурсией и без. Я не использую накопленные словари, такие как $ fib [1..N] = [], но я вычисляю сумму шага и передаю ее на следующий итерационный или рекурсивный вызов.

 // with recursion function fib($n, $a = 0, $b = 1) { if ($n < 1) { return $a; } return fib($n - 1, $b, $a + $b); } // with simple loop function fib($N) { $a = 0; $b = 1; for ($i = 0; $i < $N; $i++) { $t = $a + $b; $a = $b; $b = $t; } return $a; } 

Попробуй это. Оптимизированная функция

 function fib($n, $all=0){ f[0] = 1; f[1] = 1; for($i = 2; $i<= $n; $i++) f[$i] = f[$i-1]+f[$i-2]; if($all) return $f; return $f[$n]; } print fib(5); var_dump(fib(5, 1)); 

Если вы хотите сделать это рекурсивно

 function fib($n, $first, $second) { if( $n > 0 ) { $sum = $first + $second; $first = $second; $second = $sum; print $sum; fib($n-1, $first, $second); } } 
 $count = 0; $x = 0; $y = 1; echo $x."<br />"; echo $y."<br />"; while($count < 10) { $z = $x + $y; echo $z."<br />"; $x = $y; $y = $z; $count ++; } 

См. http://blog.innovsystems.com/php/fibonacci-series-program-php

Решение: Рабочий код PHP для последовательности фибоначчи

 $prev = 0; $curr = 1; $fib = 0; for($i=0;$i<=20;$i++){ echo $fib . ","; $prev = $curr; $curr = $fib; $fib = $prev + $curr; } 

Это так же быстро и просто, как я мог это сделать

 function fibonacci($n, $rec = 0) { echo "$n\t"; fibonacci($n + $rec, $n); } echo fibonacci(1); 

Включить header('Content-Type: text/plain'); чтобы увидеть вкладки \ t.

Недавно я столкнулся с этим вопросом и нашел ваш вопрос. Вы были на полпути, затем я изменил ваш код на рабочую версию.

 <?php function fib ($n) { // a function called fib, declaire variable n (the sequence number) if($n==0) return 0; if ($n < 3) { return 1; } // if n is smaller than 3 return n (1 or 2) else { return fib ($n - 1) + fib ($n - 2); } /* if the number is 3 or above do 2 sums (n-1) and (n-2) and then add the 2 sums together (n-1)+(n-2) Example Fibonacci number 4 (4-1)+(4-2) = 5 3 + 2 = 5 */ } echo fib(50); 

Более читаемый, нерекурсивный подход:

 function fibonacciSequence($max = 13) { if($max < 1) return []; $sequence = []; $older = 0; $newer = 1; do { $number = $newer + $older; $sequence[] = $number; $older = $newer; $newer = $number; } while($number < $max); return $sequence; } 
  <?php $b=1; $limit=500; for($a=$b++;$a<$limit;$b+=$a=$b-$a) { echo"$a<br>"; } ?> 

* EDIT: начнем с $b=1; $a=$b+$a $b=1; $a=$b+$a и $b=1 => в начале мы можем сказать $a=$b++; то положим предел $a<$limit; теперь самая сложная часть $b+=$a=$b-$a означает $b=$b+$a; и $a=$b-$a; позволяет работать с этим кодом вместе и получать удовольствие

Шаг 1: a —> 1 …. b —> 2 // b = 1 a = 1 => b = b + a = 1 + 1 = 2

Шаг 2: a —> 1 …. b —> 3 // b равно 2 a = ba = 2-1 = 1 => b = b + a = 2 + 1 = 3

Шаг 3: a —> 2 …. b —> 5 // b было 3 a = ba = 3-1 = 2 => b = b + a = 3 + 2 = 5

выход: 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Эта страница сделала это хорошо. Вы можете проверить его на наличие ссылок. Благодаря!

 <?php function printFibonacci($n) { $first = 0; $second = 1; echo "Fibonacci Series \n"; echo $first.' '.$second.' '; for($i = 2; $i < $n; $i++){ $third = $first + $second; echo $third.' '; $first = $second; $second = $third; } } /* Function call to print Fibonacci series upto 6 numbers. */ printFibonacci(6); ?> 

Или

 <?php define('NUM',11); $a = 0; $b = 1; echo "$a $b "; // 0 1 for($i=1 ; $i<= NUM-2 ; $a=$b, $b=$c, $i++ ) { echo $c = $a+$b; echo " "; } ?> 
 <?php $num = array(0, 1); for ($i=0; $i<=10; $i++) { $new_num = $num[$i-1] + $num[$i-2]; array_push($num, $new_num); } echo implode(', ',$num); ?> 
 <?php function generateFibonacci($n, $previous = 0, $current = 1) { echo $previous == 0 ? $previous.'<br />'.$current.'<br />' : $current . '<br />'; return $n == 1 ? null : generateFibonacci($n - 1, $current, $previous + $current); } generateFibonacci(20); ?> 

Mine – простой метод для получения серии fibonacii, проверьте это:

 function fibo() { $a = 0; $b = 1; echo $a; for ($i=0; $i < 10; $i++) { echo ' '.$b.' '; $sum = $a + $b; $a = $b; $b = $sum; } }