Программа занимает несколько минут, когда я пытаюсь запустить ее. cycle_length
относится к длине цикла Collatz (Collatz conjecture утверждает, что независимо от того, с какого номера вы начинаете, вы всегда достигнете 1
, если выполняете данный расчет). max_length
вычисляет длину цикла для целых чисел между i
и j
, чтобы определить, какое число производит самый длинный цикл.Как уменьшить время выполнения моей программы?
def cycle_length(n):
if n == 1:
return n
elif n % 2 == 0:
return cycle_length(n//2) + 1
else:
return cycle_length(3*n + 1) + 1
def max_length(i,j):
mxl = cycle_length(i)
mxn = i
while i <= j:
start = time.time()
y = cycle_length(i)
if y > mxl:
mxl = y
mxn = i
i += 1
return (mxn,mxl)
print(max_length(1, 10**6))
Я хочу перебирать программу из 1
в 10**6
. Есть ли эффективный способ сделать программу быстрее (до 10 лет)?
Вы можете найти 'обратный cycle_length ((п * 3) + 1, если п и 1 еще п // 2) + 1 'немного быстрее. –
@PadraicCunningham, возможно, но я не хотел заходить слишком далеко от первоначальной реализации OP - я думаю, что это вводит уже достаточно новых идей! – jonrsharpe