Форум » Рекурсивные процедуры и функции » ege16 №68 » Ответить

ege16 №68

OksanaG: 68) Алгоритм вычисления функций F(n), где n – натуральное число, задан следующими соотношениями: F(n) = n + 1 при n < 3, F(n) = F(n – 2) + n – 2, когда n ≥ 3 и четно, F(n) = F(n + 2) + n + 2, когда n ≥ 3 и нечетно. Сколько существует чисел n, для которых значение F(n) будет пятизначным? мой код var i,j,k,kol,key:integer; function f(n: integer): integer; begin var i,j:integer; if n < 3 then f:= n + 1 else if (n >= 3) and ((n mod 2) = 0) then f:= f(n - 2) + n - 2 else f:= f(n+2) + n + 2; end; begin kol:=0; for i:=1 to 10 do begin k:= f(i); key:=0; while k <> 0 do begin k:= (k div 10); key +=1; end; if (key = 5) then kol += 1; end; Writeln(kol); end. ошибка при исполнении: Ошибка времени выполнения: StackOverflowException: Программа завершена из-за переполнения программного стека Пожалуйста, подскажите почему.

Ответов - 8

OlgaChe1: [pre]function f(n: integer): integer; begin var i, j: integer; if n < 3 then f := n + 1 else if ((n mod 2) = 0) then f := f(n - 2) + n - 2 else f := f(n + 2) + n + 2; end;[/pre]

OlgaChe1: F(n) = F(n + 2) + n + 2, когда n ≥ 3 и нечетно, всегда растет... Поэтому и переполнение. Думаю, что искать пятизначные числа нужно только для четных n, поэтому убираю эту часть функции, в for 1000 или больше - ответ 216.

OksanaG: Спасибо!


Татьяна 86: Алгоритм вычисления функции F(n) задан следующими соотношениями: F(n) = n при n <= 3; F(n) = F(n – 1) + 2 · F(n / 2) при чётных n > 3; F(n) = F(n – 1) + F(n – 5) при нечётных n > 3; Определите количество натуральных значений n, при которых F(n) меньше, чем 10^8. Написала массу вариантов, но ничего не получается. Последний вариант [pre2] var n:integer; function F(n:integer):integer; begin if n<3 then F:=n else if ((n mod 2) = 0) then F:=F(n-1)+2*F(n div 2) else F:=F(n-1)+F(n-3); end; begin writeln (n); end.[/pre2] Помогите пожалуйста.

Поляков: Татьяна 86 пишет: ничего не получается Сформулируйте, пожалуйста, что именно не получается, и в чем вам нужна помощь.

Татьяна 86: Решая данную задачу на паскале, ответ дает 0, чего не может быть. Если решаю в экселе (=ЕСЛИ(ОСТАТ(A31;2)=0;B30+2*СМЕЩ(B31;-2;0);B30+B28), то 31, а в ответе 64.

Поляков: Татьяна 86 пишет: на паскале, ответ дает 0 Вы выводите на экран глобальную переменную, которая не изменялась во время работы программы. По умолчанию она равна 0.

GasDM21: Учитывая, что значение функции для четных n, больших трех вычислить невозможно, то можно обойтись и без рекурсии и без массива. Используя всего 2 переменные: Fn_2 и Fn - предпредыдущий элемент и текущий. [pre2] var n, kNum, Fn, Fn_2 :integer; begin kNum := 0; //Определение функции F(n) = F(n + 2) + n + 2, когда n ≥ 3 и нечетно //не используем, т.к. оно ссылается на СЛЕДУЮЩИЕ значения (Fn_2, Fn) := (3, 0); //f[2] = 3 n := 2; Repeat n += 2; Fn := Fn_2 + n - 2; if (Fn >= 10000) then begin kNum += 1; //Writeln(kNum,' ',Fn); - тестовый вывод end; Fn_2 := Fn; Until Fn >= 100000; writeln(kNum - 1); end. [/pre2]



полная версия страницы