Урок 22 Задача 5

Урок 22 Задача 5

Пользователь получает на вход целое положительное число N напишите рекурсивную процедуру, которая выведет все числа Фиббоначи от первого до N-ого

Есть вопрос. Существует ли вариант решения, чтобы переменные a, b и с объявлялись в теле процедуры, а не входили по ссылке? Когда я пробовал их там объявить, то при раскрутке рекурсии их значения сбрасывались до начального уровня, а не сохранялись, как показано в программе.

var
  a, b, c, n: integer;

procedure fibonachi(var a, b, c: integer; n: integer);
begin
  if n > 1 then
    fibonachi(a, b, c, n-1);

  writeln(n, ') ', a);
  c := a;
  a := a + b;
  b := c;
end;

begin
  writeln('Введите число: ');
  readln(n);
  a := 1;
  b := 0;
  fibonachi(a, b, c, n);
  readln();
end.  
vedro-compota's picture

попробуем решить без обратной раскрутки - сразу печатая значения (и без передачи по ссылки), можно завести доп. счетчик

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

var
  a, b, c, n, k: integer;

procedure fibonachi(a, b, c, k, n: integer);
begin
  writeln(k, ') ', a);
  c := a;
  a := a + b;
  b := c;
  if n > k then
    fibonachi(a, b, c, k+1, n);
end;

begin
  writeln('Введите число: ');
  readln(n);
  a := 1;
  b := 0;
  k := 1;
  fibonachi(a, b, c, k, n);
  readln();readln();
end.   
vedro-compota's picture

переменная c может быть перенесена в группу локальных для функции

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

var
  a, b, n, k: integer;

procedure fibonachi(a, b, k, n: integer);
var c: integer;
begin
  writeln(k, ') ', a);
  c := a;
  a := a + b;
  b := c;
  if n > k then
    fibonachi(a, b, k+1, n);
end;

begin
  writeln('Введите число: ');
  readln(n);
  a := 1;
  b := 0;
  k := 1;
  fibonachi(a, b, k, n);
  readln();readln();
end.