Ошибка времени выполнения: 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 комментария
Скорректировать условие
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
Не помню паскалевского синтаксиса, но как-то так:
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 февр.
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
- +1 ещё
Как это работает?
- 1 подписчик
- 07 июл.
- 82 просмотра
Источник: qna.habr.com