На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rust
  
> ошибка "Ошибка времени выполнения: 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) <= 999) then
    kolvo := kolvo + 1;
    end;

    WriteLn(cikl);
    end.
      Здравствуйте.
      Во-первых, зачем вы печатаете переменную 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) и т. д., пока не произойдёт переполнение стека.
        спасибо
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0135 ]   [ 14 queries used ]   [ Generated: 26.10.21, 21:25 GMT ]