kan3k1k3n
@kan3k1k3n

Как убрать переполнение программного стека?

у меня есть рекурсивная функция для вычисления следующего члена последовательности:
a1 = −2, a2 = 2, an = 3an−1 − an−2
код:
function f(n: integer): integer;
begin
  if n = -2
  then f:= 1
  else if n = 2
  then f:= 2
  else f:= 3*f(n-1)-f(n-2);
end;
var n: integer;
begin
  write('n = ');
  readln(n);
  write(f(n))
end.

если я ввожу n = 3, то выдается ошибка: Программа завершена из-за переполнения программного стека.
как это решить?
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
Не помню паскалевского синтаксиса, но как-то так:
function f(n: integer): integer;
var a, b, c: integer;
begin
  if n < 2
  then f:= -2
  else if n = 2
  then f:= 2
  else
  begin
     a := -2;
     b := 2;
     for i = 3...n begin
        c := b;
        b := 3*b - a;
        a := c;
     end;
     f:= b;
   end;
end;


Как видим, рекурсия тут без надобности
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы