Форум » Динамическое программирование » 5543 опечатка в формулировке » Ответить

5543 опечатка в формулировке

988013@mail.ru: (№ 5543) (М. Шагитов) Исполнитель преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера: 1. Прибавь 2 2. Умножь на 3 3. Умножь на 4 Выполняя первую из них, исполнитель увеличивает число на экране на 3(!!!!!!<- здесь опечатка), выполняя вторую – умножает на 3, выполняя третью – умножает на 4. Программой для исполнителя называется последовательность команд. Сколько существует различных программ, которые преобразуют исходное число 1 в число 600, и при этом траектория вычислений не содержит двух идущих подряд нечётных чисел.

Ответов - 5

Поляков: Спасибо, исправлено.

Mathew131: 5544 Выполняя первую из них, исполнитель увеличивает число на экране на 2, выполняя вторую – умножает на 3, выполняя третью – умножает на 4. Программой для исполнителя называется последовательность команд. Сколько существует различных программ, которые преобразуют исходное число 1 в число 600, и при этом траектория вычислений (включая начальное число) содержит три подряд идущих числа, сумма которых кратна 11 Поляков Здравствуйте. Если я пишу tr = tr + [start], то выводит правильный ответ. А если tr.append(start), то неправильный. В чем разница? [pre2] def f(start, end, tr = []): # tr.append(start) tr = tr + [start] if start == end: for i in range(len(tr)-2): if (tr[ i] + tr[i+1] + tr[i+2]) % 11 == 0: return 1 return 0 if start > end: return 0 return f(start + 2, end, tr) + f(start * 3, end, tr) + f(start * 4, end, tr) print(f(1, 600) [/pre2]

Поляков: Mathew131 пишет: Если я пишу tr = tr + [start], то выводит правильный ответ. А если tr.append(start), то неправильный. В чем разница? Хороший вопрос. Если вы ставите пустой массив в качестве значения параметра по умолчанию, то он будет единый для всех вызовов функции, а там всякая ерунда получается. tr = tr + [start] - тут вы создаете каждый раз новый массив, все нормально tr.append(start) - тут вы добавляете новое значение в хвост существующего массива, он один на все вызовы. Лучше делать так: [pre2] def f(start, end, tr = None): if tr is None: tr = [] ... [/pre2]Тогда tr.append(start) тоже будет работать.


gutgut: Предлагаю не пользоваться параметрами по умолчанию, что чревато неожиданными сюрпризами. Перепишем программу автора Mathew131 следующим образом: [pre2] def f(value, end, tr): if value == end: for k in range(len(tr)-2): if (tr[k] + tr[k+1] + tr[k+2]) % 11 == 0: return 1 return 0 if value > end: return 0 return f(value + 2, end, tr+[value]) \ + f(value * 3, end, tr+[value]) \ + f(value * 4, end, tr+[value]) print(f(1, 600, [])) [/pre2]

Поляков: gutgut пишет: Предлагаю не пользоваться параметрами по умолчанию, что чревато неожиданными сюрпризами. AFAIK, только если значение по умолчанию - массив. Или еще когда-то?



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