Форум » Циклы и ветвления » Вариант № ZZFFB B11-ошибка? » Ответить

Вариант № ZZFFB B11-ошибка?

Anet: Добрый вечер.У вас в ответах получается-60,у меня 47.Объясните,пожалуйста,как решается ?

Ответов - 13

Anet: procedure F(n: integer); begin writeln(n); if n < 6 then begin F(n + 2); F(n + 3) end end; Найдите сумму чисел, которые будут выведены при вызове F(1).

Поляков: Anet пишет: У вас в ответах получается-60,у меня 47.Объясните,пожалуйста,как решается ? Чтобы разобраться, загрузите программу в любую Паскаль-среду и пройдите её в отладчике. Ответ на этот вопрос вы можете найти самостоятельно.

Anet: program aaf; uses crt; var s:integer; procedure F(n: integer); begin writeln(n); s:=s+n; if n < 6 then begin F(n + 2); F(n + 3) end end; begin f(1); writeln('',s); readkey; end. В ответе получается 47.


Поляков: Anet пишет: В ответе получается 47. Вы забыли еще один writeln: [pre2]procedure F(n: integer); begin writeln(n); s:=s+n; if n < 6 then begin writeln(n); s:=s+n; F(n + 2); F(n + 3) end end;[/pre2]

Лосевская: Добрый вечер! В заданиях ege11 №54, 55, 56, 57 получаются другие ответы, нельзя ли их проверить?

Поляков: Лосевская пишет: В заданиях ege11 №54, 55, 56, 57 получаются другие ответы, нельзя ли их проверить? Можно запустить программу в Паскаль-среде и проверить. В чем проблема?

Галина: Вашу программу проверила на Вашем разобранном примере, где ответ 49. Получается 63. Вот она: program rec1_PKU; var n,S: integer; procedure F(n: integer); begin writeln(n); s:=s+n; writeln( ' S=',S); if n < 5 then begin writeln(n); s:=s+n; F(n + 1); F(n + 3); end end; begin F(1); writeln('Otvet:',S); end. Окно вывода: 1 S=1 1 2 S=4 2 3 S=9 3 4 S=16 4 5 S=25 7 S=32 6 S=38 5 S=43 4 S=47 4 5 S=56 7 S=63 Otvet:63 Думаю, что после IF не надо writeln(n); s:=s+n; Наверное, программа д.б. такая: program rec1_GGA; var n,S: integer; procedure F(n: integer); begin writeln(n); s:=s+n; writeln( ' S=',S); if n < 5 then begin F(n + 1); F(n + 3); end end; begin F(1); writeln('Otvet:',s); end. Окно вывода: 1 S=1 2 S=3 3 S=6 4 S=10 5 S=15 7 S=22 6 S=28 5 S=33 4 S=37 5 S=42 7 S=49 Otvet:49

Поляков: Галина пишет: Вашу программу проверила на Вашем разобранном примере, где ответ 49. В разобранном примере один оператор writeln.

Галина: С Днем радио! Поэтому и пытаюсь разобраться - зачем ставить второй writeln после IF? Дублируются 1, 3, 5, 4. И в сумме получается 60. Дерево у меня такое: 1 3 4 5 6 6 7 7 8 В сумме получается 47. Программа: program rec53var_GGA; var n,S: integer; procedure F(n: integer); begin S:=S+n; writeln(n, ' S=',S); if n < 6 then begin F(n + 2); F(n + 3); end end; begin F(1); writeln(' Ответ: ',S); end. Окно вывода: 1 S=1 3 S=4 5 S=9 7 S=16 8 S=24 6 S=30 4 S=34 6 S=40 7 S=47 Ответ: 47 Ваша программа: program rec53var_KP; var s: integer; procedure F(n: integer); begin write( 'n=',n); s:=s+n; writeln( ' S=',S); if n < 6 then begin writeln('n1=',n, ' S1=',S); s:=s+n; F(n + 2); F(n + 3); end end; begin F(1); writeln('Otvet:',s); end. Окно вывода: n=1 S=1 n1=1 S1=1 n=3 S=5 n1=3 S1=5 n=5 S=13 n1=5 S1=13 n=7 S=25 n=8 S=33 n=6 S=39 n=4 S=43 n1=4 S1=43 n=6 S=53 n=7 S=60 Otvet:60 Здесь в переменной n1 дублируемые данные

Поляков: Галина пишет: Поэтому и пытаюсь разобраться - зачем ставить второй writeln после IF? Это зависит от условия задачи. Читайте его внимательно. Если есть второй writeln - ставим. Если нет - не ставим.

Галина: Спасибо! Условие внимательно прочитала! По программным кодам все прояснилось! Т.е. дерево я построила для случая с одним верхним writeln. Подскажите, пожалуйста, как будет выглядеть дерево для вар 53 (writeln(n); F(n+2); F(n+3))?

Поляков: Галина пишет: как будет выглядеть дерево для вар 53 (writeln(n); F(n+2); F(n+3))? Боюсь, что дерево тут только запутает. Дерево хорошо и наглядно для варианта с одним выводом. Здесь рекуррентная формула:[pre2] F(n) = n, для n >= 6 F(n) = n+n+F(n+2)+F(n+3), для n < 6 [/pre2]

Галина: Спасибо!



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