Учебные задачи PHP. Задача 4

Вывести на экран n-ное число Фибоначчи.

<?php
$s = 0; // сумма двух предыдущих членов последовательности
$a = 0; // предпоследний член последовательности
$b = 1; // последний член последовательности
$n = 20; //количество членов последовательности (итераций цикла)
for ($i = 0; $i < $n; $i ++)
{
	$s = $a + $b; // сумма двух предыдущих членов последовательности
	echo "$s <br>"; // выводим на экран сумму
	$a = $b; // присваиваем значение последнего члена послед-ти предпоследнему
	$b = $s; // присваиваем значение суммы послед-ти последнему члену
}
?>

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

все решения старайтесь сразу оформлять в виде функции. В данном случае понятно, что это самое число надо сначала из функции вернуть.

_____________
матфак вгу и остальная классика =)

Написал код решения задачи в виде функции. Код выдает ошибку:

PHP Warning: Missing argument 1 for fibo(), called in index.php on line 18 and defined in index.php on line 2 PHP Notice: Undefined variable: n in index.php on line 9 Array ( )

Я что-то пока не могу сообразить, что не так?
П.С. Функцию print_r использовал в качестве отладки. Потом переделаю.

<?php
function fibo ($n)
{
//$s = 0; // сумма двух предыдущих членов последовательности
$a = 0; // предпоследний член последовательности
$b = 1; // последний член последовательности
//$n = 20; //количество членов последовательности (итераций цикла)
$s= array();
for ($i = 0; $i < $n; $i ++)
{
    $s[] = $a + $b; // сумма двух предыдущих членов последовательности
    //echo "$s <br>"; // выводим на экран сумму
    $a = $b; // присваиваем значение последнего члена послед-ти предпоследнему
    $b = $s; // присваиваем значение суммы послед-ти последнему члену
}
	return $s;
}
print_r (fibo (5));
?>
melisa's picture

  1. function fibo ($n)
    {
    //$s = 0; // сумма двух предыдущих членов последовательности

    здесь не хватает отступов

  2. }
        return $s;

    Здесь лишние отступы

  3. Ознакомьтесь со стандартами оформления кода PSR. Следование данному стандарту очень важно. Это обязательное правило в разработке для увеличения читаемости вашего кода другими программистами, и наоборот.

    Перепешите задачу с учётом исправлений.

  4. Также ознакомьтесь с общепринятыми правилами именования сущностей и переименуйте функцию и некоторые переменные, названные в snake_case стиле.
vedro-compota's picture

 $s[] = $a + $b; // сумма двух предыдущих членов последовательности
    //echo "$s <br>"; // выводим на экран сумму
    $a = $b; // присваиваем значение последнего члена послед-ти предпоследнему
    $b = $s;

вы во второй интерации пытаетесь сложить число с массивом так как в конце первой выполнили:

$b = $s;
PHP Warning: Missing argument 1 for fibo(), called in index.php

для кода, который вы прислали ошибка не эта.
тут вы передаете переменную нормально.

_____________
матфак вгу и остальная классика =)

<?php
function fibo($count)
{
$a = 0; // предпоследний член последовательности
$b = 1; // последний член последовательности
	for ($i = 0; $i < $count; $i ++) {
		$sum = $a + $b; // сумма двух предыдущих членов последовательности
		$sum_arr[] = $sum;
		$a = $b; // присваиваем значение последнего члена послед-ти предпоследнему
		$b = $sum; // присваиваем значение суммы послед-ти последнему члену
	}
    return $sum_arr;
}
$fiboCount = fibo(11);
foreach ($fiboCount as $value) {
	echo $value. " ";
	}
?>
melisa's picture

Логически код расчёта следующего значения верный. НО есть пара моментов другого рода:

  1. Результат должен чётко соответствовать тому, что запрашивалось в задаче.
    Просили вывести n-ный член последовательности, а Вы выводите все. Но ладно было бы ещё, если бы все, из которых последний - искомый. Но последний элемент, который выводит Ваш алгоритм - 13й по факту. Потому что первые два элемента Вы не посчитали нужным посчитать). Понимаете? Это проблема не логики присвоения значений последовательности, а именно выбора элемента. На это важно обращать внимание. А-то просят кур считать, а Вы фуру разгрузили)
  2. Отступы. Проверяйте себя. Закрывающая фигурная скобка ВСЕГДА должна быть на одном уровне с оператором, который она закрывает.
    foreach ($fiboCount as $value) {
        echo $value. " ";
        }

    А тут наоборот не хватает отступов:

    {
    $a = 0; // предпоследний член последовательности
    $b = 1; // последний член последовательности

    И ещё: лучше делать пустую строку перед for, foreach, if. так легче будет читать код. Например, так:

        $b = 1; // последний член последовательности
    
        for ($i = 0; $i < $count; $i ++) {
            // ...
        }
    
        if () {
            // ...
        }
    
        return $sum_arr;

<?php
function fibo($count)
{
	$a = -1; // течнический параметр, для запуска кода
	$b = 1; // 2-ый член последовательности
	
    for ($i = 0; $i < $count; $i ++) {				 
        $sum = $a + $b; // сумма двух предыдущих членов последовательности
        $a = $b; // присваиваем значение последнего члена послед-ти предпоследнему
        $b = $sum;			
	}
	return $sum;
}
$n = rand(1,20);
$fiboCount = fibo($n);
echo "$n - ое число последовательности: $fiboCount";
?>
		
melisa's picture

$a = -1; // течнический параметр, для запуска кода

интересное решение) классно)
принято