Ошибка времени выполнения программа завершена из за переполнения программного стека

Ошибка времени выполнения: StackOverflowException: Программа завершена из-за переполнения программного стека

здравствуйте.
Выходит ошибка «Ошибка времени выполнения: StackOverflowException: Программа завершена из-за переполнения программного стека». В чем ошибка, не пойму.

Вот задача
(Е. Джобс) Алгоритм вычисления функции F(n), где n – натуральное число, задан следующими соотношениями:
F(n) = n + 1 при n < 3,
F(n) = n + 2*F(n + 2), когда n ≥ 3 и четно,
F(n) = F(n – 2) + n – 2, когда n ≥ 3 и нечетно.
Сколько существует чисел n, для которых значение F(n) будет трехзначным.
Ответ известен : 22

Ниже мой код:
//Функция F

function F(n: integer): integer; begin if n < 3 then F := n + 1 else if ((n mod 2) = 0) then F := n + 2 * F(n + 2) else F := F(n — 2) + n — 2; end; var cikl, kolvo: integer; //Основная часть программы, где запускаем функцию. begin kolvo := 0; for cikl := 1 to 100 do begin if (F(cikl) >= 100) and (F(cikl)
Последний раз редактировалось BDA; 28.02.2021 в 19:09 .
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,138

Обнаружено переполнение стекового буфера в Windows 11/10

Во-первых, используйте кнопочку CODE для оформления кода. Во-вторых, можно заметить, что для четных n ≥ 3 функция F(n) зависит от F(n + 2). n + 2 тоже четное число, так что тут возникает бесконечная рекурсия.

Пишите язык программирования — это форум программистов , а не экстрасенсов. (<= это подпись )
Пользователь
Регистрация: 18.05.2007
Сообщений: 19

Во-первых, используйте кнопочку CODE для оформления кода. Во-вторых, можно заметить, что для четных n ≥ 3 функция F(n) зависит от F(n + 2). n + 2 тоже четное число, так что тут возникает бесконечная рекурсия.

Читайте также:
Использование компьютерных программ для анализа финансового состояния организации

понятно. спасибо

Источник: www.programmersforum.ru

Ошибка времени выполнения: StackOverflowException: Программа завершена из-за переполнения программного стека — PascalABC.NET (123004)

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

uses GraphABC; type Square=record x,y:word; c:color; end; type Snake=record body:array of Square; face:byte; length,x,y:word; end; const side=5; var a:snake; field:array of Square; w,h:word; i : longword; procedure GivePos; begin var a,b:word; a:=random(w); b:=random(h); if field.All(z->Abs(z.x-a)>=side) or field.All(az->Abs(az.y-b)>=side) then begin field[i-1].x:=a; field[i-1].y:=b; end else GivePos; end; procedure GenSq(amm:longword); begin SetLength(field,amm); repeat i+=1; field[i-1].c:=RGB(random(255),random(255),random(255)); GivePos; until i=amm; end; procedure DrawSq; begin foreach aa:square in field do begin SetBrushColor(aa.c); FillRect(aa.x,aa.y,aa.x+side,aa.y+side); end; end; begin w:=Window.Width; h:=Window.Height; GenSq(150); DrawSq; end.

Код к задаче: «Ошибка времени выполнения: StackOverflowException: Программа завершена из-за переполнения программного стека»

Листинг программы

Ошибка Microsoft Visual C++ Runtime Library как исправить в Windows 10 8.1 и Windows 7


procedure GivePos; begin var a, b: word; a := random(w-1); b := random(h-1); if field.All(z -> Abs(z.x — a) >= side) or field.All(az -> Abs(az.y — b) >= side) then begin field[i — 1].x := a; field[i — 1].y := b; end //else exit;//GivePos; end;

Источник: studassistent.ru

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

у меня есть рекурсивная функция для вычисления следующего члена последовательности:
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, то выдается ошибка: Программа завершена из-за переполнения программного стека.
как это решить?

  • Вопрос задан 25 февр.
  • 74 просмотра

4 комментария

Простой 4 комментария

HemulGM

Скорректировать условие

kan3k1k3n

Hemul GM, а как именно. что не так в моем условии?
kan3k1k3n, у Вас написано: если n=-2 тогда f:=1. А надо-то наоборот: если n=1 тогда f:=-2.

Для технической отладки рекурсивных функций можно вводить дополнительный параметр — текущий уровень рекурсии и его проверять перед выполнением всей функции, чтобы из за ошибок в коде выполнение не проваливалось в бесконечность рекурсии.

function f(n: integer, current_level: integer): integer; begin if current_level > 1000 «В начале рекурсивной функции сразу проверяем, не вышли мы за какое-то отладочное значение, например, 1000» write(‘Что-то пошло не так, достигнут предел рекурсии!’) else . else f:= 3*f(n-1, current_level + 1)-f(n-2, current_level + 1); «Добавляем и прибавляем значение уровня при рекурсивном вызове» . write(f(n, 1)) «Уровню рекурсии задаем начальное значение»
Решения вопроса 0
Ответы на вопрос 1

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;

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

Ответ написан 25 февр.

HemulGM

function f(n: integer): integer; var a, c: integer; begin if n < 2 then Exit(-2); if n = 2 then Exit(2); var a := -2; var Result := 2; for var i := 3 to n do begin c := Result; Result := 3 * Result — a; a := c; end; end;
Ваш ответ на вопрос

Читайте также:
Как перекинуть программу через блютуз на Андроид

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

assembler

  • Assembler
  • +1 ещё

Как это работает?

  • 1 подписчик
  • 07 июл.
  • 82 просмотра

Источник: qna.habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru