Задать вопрос
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, то выдается ошибка: Программа завершена из-за переполнения программного стека.
как это решить?
  • Вопрос задан
  • 268 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 2
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;


Как видим, рекурсия тут без надобности
Ответ написан
Mutilator
@Mutilator
Первое условие остановки не соответствует формулировке задания.
У тебя:
if n = -2
  then f:= 1

...а согласно формуле
a1 = −2, a2 = 2, aN = 3aN−1 − aN−2
должно быть:
if n = 1
  then f:= -2
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы