我有一些 Collat??z 序列代碼,可以找到小于或等于用戶輸入數字的最大長度序列。它適用于相對較小的數字。但是,我希望將我的代碼用于更大的數字。有沒有人有任何提示可以使我的代碼更高效,以便它運行到 100 萬不需要幾分鐘?
uj5u.com熱心網友回復:
永遠不要把同樣的事情計算兩次。您正在計算彼此重疊的完整 collat??z 序列。一旦一個序列減少到您計算出的前一個序列,您就是在重復作業。
collatz_lengths = {1: 1}
def collatz(a):
if a % 2 == 0:
return a // 2
else: # No need to check a%2 != 0 here
return 3*a 1
def find_length(start):
if start not in collatz_lengths:
next_number = collatz(start)
collatz_lengths[start] = 1 find_length(next_number)
return collatz_lengths[start]
def longest_length(n):
max_length = 0
max_start = 1
for start in range(1, n 1):
collatz_lengths[start] = find_length(start)
if collatz_lengths[start] > max_length:
max_length = collatz_lengths[start]
max_start = start
return max_start
運行只需要幾秒鐘
>>> longest_length(1000000)
837799
>>> find_length(837799)
525
大約 20 秒運行
>>> longest_length(10000000)
8400511
>>> find_length(8400511)
686
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362857.html
