Автор | Сообщение |
|
Отправлено: 23.11.22 17:15. Заголовок: 5543 опечатка в формулировке
(№ 5543) (М. Шагитов) Исполнитель преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера: 1. Прибавь 2 2. Умножь на 3 3. Умножь на 4 Выполняя первую из них, исполнитель увеличивает число на экране на 3(!!!!!!<- здесь опечатка), выполняя вторую – умножает на 3, выполняя третью – умножает на 4. Программой для исполнителя называется последовательность команд. Сколько существует различных программ, которые преобразуют исходное число 1 в число 600, и при этом траектория вычислений не содержит двух идущих подряд нечётных чисел.
|
|
|
Ответов - 5
[только новые]
|
|
|
| Администратор
|
Сообщение: 3805
|
|
Отправлено: 15.12.22 19:58. Заголовок: Спасибо, исправлено...
Спасибо, исправлено.
|
|
|
|
Отправлено: 20.01.23 18:51. Заголовок: Поляков Здравствуйт..
5544 Выполняя первую из них, исполнитель увеличивает число на экране на 2, выполняя вторую – умножает на 3, выполняя третью – умножает на 4. Программой для исполнителя называется последовательность команд. Сколько существует различных программ, которые преобразуют исходное число 1 в число 600, и при этом траектория вычислений (включая начальное число) содержит три подряд идущих числа, сумма которых кратна 11 Поляков Здравствуйте. Если я пишу tr = tr + [start], то выводит правильный ответ. А если tr.append(start), то неправильный. В чем разница? 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)
|
|
|
|
| Администратор
|
Сообщение: 3809
|
|
Отправлено: 20.01.23 19:02. Заголовок: Mathew131 пишет: Есл..
Mathew131 пишет: цитата: | Если я пишу tr = tr + [start], то выводит правильный ответ. А если tr.append(start), то неправильный. В чем разница? |
| Хороший вопрос. Если вы ставите пустой массив в качестве значения параметра по умолчанию, то он будет единый для всех вызовов функции, а там всякая ерунда получается. tr = tr + [start] - тут вы создаете каждый раз новый массив, все нормально tr.append(start) - тут вы добавляете новое значение в хвост существующего массива, он один на все вызовы. Лучше делать так: def f(start, end, tr = None): if tr is None: tr = [] ... Тогда tr.append(start) тоже будет работать.
|
|
|
|
Отправлено: 03.02.23 22:04. Заголовок: Предлагаю "безопасное" решение задачи 5544
Предлагаю не пользоваться параметрами по умолчанию, что чревато неожиданными сюрпризами. Перепишем программу автора Mathew131 следующим образом: 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, []))
|
|
|
|
| Администратор
|
Сообщение: 3895
|
|
Отправлено: 15.02.23 10:46. Заголовок: gutgut пишет: Предла..
gutgut пишет: цитата: | Предлагаю не пользоваться параметрами по умолчанию, что чревато неожиданными сюрпризами. |
|
AFAIK, только если значение по умолчанию - массив. Или еще когда-то?
|
|
|
|