Не запускается программа в питоне. По идее она должна выдать наименьшее число а, при котором результат программы будет 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 шт):

Автор решения: Stanislav Volodarskiy

Функция 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 оставаясь положительными. Он и решает задачу.

→ Ссылка