Будьте внимательны! Проект находится в тестовой эксплуатации!
Играй - Развивайся - Поступай в ТПУ
Информатика

Раздел: Информатика / 1. Информация и информационные процессы / 1.5. Логика и алгоритмы / 1.5.3. Индуктивное определение объектов

Вопрос №:  28048

На языке Pascal написаны следующие рекурсивные функции:

function g(x:integer): integer; forward;
function f(x: integer): integer;
begin
 if (x > 1)
 then if (x mod 2 = 0) then f := x * g(x div 2) else f := x * f(x div 2)
 else f := 1;
end;

function g(x: integer): integer;
begin
 if (x > 2)
 then if (x mod 3 = 0) then g := x * f(x div 3) else g := x * g(x div 3)
 else g := 2;
end;

Какое значение будет возвращено при выполнении вызова f(30)?

Впишите свой вариант ответа:

Рекурсивные вызовы будут отрабатывать следующим образом.

СПУСК
1. f(30). Оба условия выполняются, значит, возвращается результат 30*g(30 div 2).
2. g(15). Оба условия выполняются, значит, возвращается результат 15*f(15 div 3).
3. f(5). Условие1 выполняется, условие2 - нет, значит, возвращается результат 5*f(5 div 2).
4. f(2). Оба условия выполняются, значит, возвращается результат 2*g(1).
5. g(1). Условие1 не выполняется, значит, возвращается результат 2.

ПОДЪЕМ
5. Возврат 2.
4. Вычисление 2*2. Возврат 4.
3. Вычисление 5*4. Возврат 20.
2. Вычисление 15*20. Возврат 300.
1. Вычисление 30*300. Возврат 9000.

Ответ: 9000