Задание: Нужно написать рекурсию алгоритмов ** языке Паскаль. Нахождение n-го члена ряда...

0 голосов
42 просмотров

Задание: Нужно написать рекурсию алгоритмов на языке Паскаль. Нахождение n-го члена ряда Фибоначчи. Буду благодарна)


Информатика (136 баллов) | 42 просмотров
0

"рекурсию алгоритмов"... и сразу становится понятно, что у автора уровень знаний, ... мгм ... возможно, чуть выше пресловутого плинтуса.

Дан 1 ответ
0 голосов
Правильный ответ

Числа Фибоначчи определяются следующим образом:
F_0=1; \ F_1=1; \ F_n=F_{n-1}+F_{n-2}, \ n\geqslant2, \ n\in \mathbb Z
Для перехода от математической записи к записи, пригодной для алгоритмизации (и программирования), нужно представить число Фибоначчи в виде некоей функции F(n) и уже эту функцию программировать. Такое представление получить в данном случае очень просто.
F(n)=\left\{\begin{matrix}
1 & & n=0,1 \\ F(n-1)+F(n-2) & & n\geqslant2, \ n\in \mathbb Z
\end{matrix}\right.

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

1. Очень короткая реализация
// PascalABC.NET 3.1, сборка 1250 от 28.05.2016
function Fib(n:integer):integer:=(n<2?1:Fib(n-1)+Fib(n-2));<br>
begin
  Writeln(Fib(ReadInteger('n=')))
end.

Тестовое решение
n= 20
10946

2. Более традиционная реализация
// PascalABC.NET 3.1, сборка 1250 от 28.05.2016
function Fib(n:integer):integer;
begin
  if n<2 then Result:=1<br>  else Result:=Fib(n-1)+Fib(n-2)
end;

begin
  Writeln(Fib(ReadInteger('n=')))
end.

3. Тупо-школьная реализация
// PascalABC.NET 3.1, сборка 1250 от 28.05.2016
function Fib(n:integer):integer;
begin
  if n<2 then Fib:=1<br>  else Fib:=Fib(n-1)+Fib(n-2)
end;

var
  n:integer;
begin
  Write('n='); Read(n);
  Writeln(Fib(n))
end.

Как хорошо видно, по мере деградации уровня программирования программа становится длиннее, но ни в коем случае ни яснее, ни эффективнее.




(142k баллов)