Рекурсивный алгоритм.
Найти сумму чисел, полученных при вызове F(1).
Ответ: 530.
Объясните принцип решения, прошу.
Приложения:
Аноним:
чушь какая-то. Кто это будет руками такую рекурсию прокручивать, 91 число на выдаче. А если программно подсчитать, то надо просто вставить вместо печати суммирование в глобальную переменную.
Вот-вот. Сам в замешательстве. Прокручивал до этого рекурсии по 80-90, а тут в пробнике пришло такое. Жесть!
Могу написать свою версию программы, которая получает значение 530.
Было бы замечательно.
Ответы
Ответ дал:
1
Трассировка вызовов, печатаемых значений и подсчет суммы
var
s:integer;
procedure F(n:integer);
begin
Write(' F(',n,') ');
Write(n,' '); s:=s+n;
if n<6 then begin
Write(n); s:=s+n;
F(n+1);
F(n+2);
F(2*n)
end
end;
begin
s:=0;
F(1);
Writeln(#13#10,s)
end.
Результат выполнения программы:
F(1) 1 1 F(2) 2 2 F(3) 3 3 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(3) 3 3 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(2) 2 2 F(3) 3 3 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8
530
var
s:integer;
procedure F(n:integer);
begin
Write(' F(',n,') ');
Write(n,' '); s:=s+n;
if n<6 then begin
Write(n); s:=s+n;
F(n+1);
F(n+2);
F(2*n)
end
end;
begin
s:=0;
F(1);
Writeln(#13#10,s)
end.
Результат выполнения программы:
F(1) 1 1 F(2) 2 2 F(3) 3 3 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(3) 3 3 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(2) 2 2 F(3) 3 3 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8 F(4) 4 4 F(5) 5 5 F(6) 6 F(7) 7 F(10) 10 F(6) 6 F(8) 8
530
F(3)=83
F(2)=177
F(1)=438
У Вас ошибка: во фрагменте if n < 6 then begin
writeln(n);
F(n+2); у Вас нет подсуммирования, хотя значение выводится.
writeln(n);
F(n+2); у Вас нет подсуммирования, хотя значение выводится.
Правильность моего решения, кроме всего, подтверждена тем, что сумма сходится с приведенной автором вопроса.
Точно.
Если будет скучно, рекомендую Вашему вниманию руками прокрутить функцию Аккермана. Ана была им предложена в свое время, как некий вызов создателям компиляторов с языков, разрешающих рекурсию. Подробности, думаю, есть в интернет.
Я балда. Я прозевала Writeln(n) до условия. Ничего не меняется у меня
А скучно мне не бывает никогда. Времени нет на скуку
В смысле наоборот я не считаю сумму в условии
Вас заинтересует
2 года назад
2 года назад
2 года назад
2 года назад
7 лет назад