Не запускается программа в питоне. По идее она должна выдать наименьшее число а, при котором результат программы будет 10
Ошибку не выдаёт, просто не считает.
def f(x):
a = 3*x + 23
b = 3*x - 17
while a != b:
if a > b:
a -=b
else:
b -=a
return a
for x in range(1,10000):
if f(x) == 10:
print(x)
break
Ответы (1 шт):
Функция f останавливается не для всех x. Вы запускаете её для неудачного значения и вечно ждёте результат. Не все программы завершаются. Попробуйте с другого конца.
Пусть f(x) == 10. Какими были a и b когда произошёл return? a = b = 10. А до этого? Или a = 20, b = 10 или a = 10, b = 20. А до этого? Или a = 30, b = 10 или a = 20, b = 30 или a = 30, b = 20 или a = 10, b = 30.
Можно догадаться до двух вещей: чтобы функция завершилась и выдала 10 нужно чтобы в какой-то момент времени выполнились условия a, b > 0 и a, b кратны 10.
Если a, b > 0 в какой-то момент, алгоритм завершается (доказывается по индукции). Если b <= 0 функция не завершается никогда. Условие кратности опустим на время. Поставим эксперимент:
def f(x):
a = 3*x + 23
b = 3*x - 17
while a != b:
if a > b:
a -=b
else:
b -=a
return a
for x in range(1,10000):
if 3*x + 23 > 0 and 3*x - 17 > 0 and f(x) == 10:
print(x)
break
9
Теперь ясно что эксперимент можно было не ставить. Достаточно найти минимальный x такой чтобы a, b делились на 10 оставаясь положительными. Он и решает задачу.