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

Список учебных задач PHP здесь

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

<?php
$n = 9; // количество чисел в последовательности Фибоначчи
$a = 0;
$b = 1;
echo $a, "<br>";
echo $b, "<br>";
for ($i = 2; $i <= $n; $i++) {
	$c = $a + $b;
	echo $c, "<br>";
	$a = $b; // следующий $a равняется предыдущему $b
	$b = $c; // следующий $b равняется $с из предыдущей интерации цикла
}
?>

\$n=9; Но на экран выводится 10 чисел.
Лучше это записать как функцию, у которой на входе номер элемента последовательности, а на выходе — сам элемент.

rvsokolov's picture

Не совсем понял необходимость применения функции в данном случае. В предыдущем решении можно было исправить значение i в цикле for, чтобы при n=9 выводилось девять чисел, а не десять.
Подскажите, в чем необходимость решения через функцию?

<?php
function fb($n)
{
	$a = 0;
	$b = 1;
	echo $a, "<br>";
	echo $b, "<br>";
	for ($i = 3; $i <= $n; $i++) {
		$c = $a + $b;
		echo $c, "<br>";
		$a = $b;
		$b = $c;
	}
}
fb(9);
?>
vedro-compota's picture

Не совсем понял необходимость применения функции в данном случае.

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

Такое решение было бы более переносимым.

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

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

К тому же

fb(1);

напечатает и первый элемент, и второй.

rvsokolov's picture

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

Я понял свою предыдущую ошибку. От меня не требуется выводить всю последовательность, нужно только строчку с номером и соответствующим ему числом в последовательности

<?php
function fb($n)
{
	$a = 0;
	$b = 1;
	if ($n == 1) {
		echo "$n" . "-ое число последовательности: $a";
	} elseif ($n == 2) {
		echo "$n" . "-ое число последовательности: $b";
	} elseif ($n > 2) {
		for ($i = 3; $i <= $n; $i++) {
			$c = $a + $b;
			$a = $b;
			$b = $c;
		}
		echo "$n" . "-ое число последовательности: $c";
	}
}
fb(rand(1,20));
?>

Да. Одно число по номеру.
vedro-compota говорил о функции, которая возвращает это число, и потом эту функцию использовать. Например, так:

$n = rand(1,20);
$a = fb($n);
echo "$n" . "-ое число последовательности: $a";
rvsokolov's picture

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

Плиз, если можно, объясните простым языком почему мой вариант неверный и что именно нужно доработать?

vedro-compota's picture

тут почти все хорошо. но побочный эффект лучше оказывать снаружи в клиентском коде. Уберите echo из функции - -просто возвращайте значение, а распечатывайте уже снаружи.

Плиз, если можно, объясните простым языком почему мой вариант неверный и что именно нужно доработать?

ваша функция не возвращает значение, а выводит его на экран, это абсолютно разные вещи, почитайте про возврат: http://fkn.ktu10.com/?q=node/8724

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

rvsokolov's picture

Исправленное решение

<?php
function fb($n)
{
    $a = 0;
    $b = 1;
    if ($n == 1) {
        $result = $a;
    } elseif ($n == 2) {
        $result = $b;
    } elseif ($n > 2) {
        for ($i = 3; $i <= $n; $i++) {
            $c = $a + $b;
            $a = $b;
            $b = $c;
        }
        $result = $c;
    }
	return $result;
}
$n = rand(1,20);
$numberFib = fb($n);
echo $n . '-ое число последовательности: ' . $numberFib;
?>
vedro-compota's picture

да верно, решение засчитано.

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