
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
![]() |
|
Сообщ.
#1
,
|
|
|
здравствуйте.
Выходит ошибка "Ошибка времени выполнения: 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) <= 999) then kolvo := kolvo + 1; end; WriteLn(cikl); end. |
Сообщ.
#2
,
|
|
|
Здравствуйте.
Во-первых, зачем вы печатаете переменную cikl? Видимо, нужно было WriteLn(kolvo). Во-вторых, попробуйте запустить свою функцию F не в цикле, а отдельно с любым чётным аргументом, например, 4. Что у вас происходит. 4 - чётное, выполняется условие if ((n mod 2) = 0) и F := n + 2 * F(n + 2) Т.е. происходит новый вызов F(6). 6 - тоже чётное. F(6) вызывает F(8), F(8) вызывает F(10) и т. д., пока не произойдёт переполнение стека. |
Сообщ.
#3
,
|
|
|
спасибо
|