Этот 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; } }