В двух почти одинаковых кодах разные результаты в выходе

Первый:

def f(x, y, a):
    return ((x - 30 < a) and (15 - y < a)) or (x * (y + 3) > 60)

for a in range(1, 1001):
    fl = True
    for x in range(1, 1001):
        for y in range(1, 1001):
            if not( f(x, y, a) ):
                fl = False
                break
        if not(fl):
            break
    if fl:
        print(a)
        break

Второй:

def f(x, y, a):
    return ((x - 30 < a) and (15 - y < a)) or (x * (y + 3) > 60)

for a in range(1001):
    fl = True
    for x in range(1001):
        for y in range(1001):
            if not( f(x, y, a) ):
                fl = False
                break
        if not(fl):
            break
    if fl:
        print(a)
        break

Разница лишь в range(), но в первом случае выход равен 15, а во втором 16.


Ответы (1 шт):

Автор решения: CrazyElf

Разница тут:

print(f(1, 1, 15))
print(f(0, 0, 15))

Вывод:

True
False

Циклы, проходящие x и y от 1 выполняются целиком уже на a = 15 и алгоритм заканчивается, а вот циклы, начинающиеся с 0, на a = 15 прерываются досрочно из-за f(0, 0, 15) == False и выполняются успешно до конца только при a = 16.

→ Ссылка