要确定内存错误,请在limit=100下运行代码并打印链。
你可能想序列化递归代码:
lengths={1: 1}
defCollatz(I ) :
i0=i
acc=0
while True:
if i in lengths:
lengths[i0]=acc lengths[i]
返回ACC lengths [ I ]
acc =1
I=(I*31 ) if i % 2 else i //2
长整型=1
foriinrange (1,100000 ) :
c=Collatz(I ) )
if c longest:
longest=c
打印(I,c ) ) )。
当然,可以通过多种方法进行优化,但可以在4秒以内产生所期待的结果
编辑:
你的方法列一个清单。 这个名单的长度达到了历史上最高的期限。 如果limit=100,则这是9232。 这不是很多。 但是,如果极限=1000000,则是56991483520 (以704511开始的链),这真的是新人。 对于int32或更高的数组,此存储器
这是一条麻烦的链条。 704511、2113534、1056767、3170302、1585151、4755454、2377727、7133182、3596591、10699774、5349887、16049662、8024831 54167614、27083807 182815702、91407851、274223554、137111777、411335332、205667666、102833833、308501500、154250750 390447215、11713416365、17567075、178670780、1976639030、988319515、2964958546、1482479273、4449273 1677789183、500333 11257576990、562878495、16886365486、84443182743, 2532954443 3561967720、1780983860、890491930、445245965、1335737896、667868948、333934474、166967237、500901712、2504555 2934971、8804914、4402457、13207372、6603686、3301843、9905530、4952765、14858296、744448296 478897、12536692、6268346 3525946、1762973、5288920、2644460、132230 231266、1115633、3346900、1673450、836725、2510176、1255088、627544、31313 88249、264748、132374、66187、198562、99281、297844、148922、74661、223384、111692、55846、55846 23561、70684、35555 29821、89464、44732、22366、11183、33550 8928、42464、21232、10616、5308、2654、1327、3982、1991、5974、2987、888 100、50、25、76、38、19、5 8、29、88、44、22、11、34、17、52、26、13、40、20
使用您准确的递归思想,但运行dict (稀疏)而不是列表时没有问题)。
lengths={1: 1}
defCollatz(I ) :
ifiinlengths : returnlengths [ I ]
j=(I*31 ) if i % 2 else i //2
c=Collatz(j ) 1
lengths [i]=c
返回c
长整型=1
foriinrange (1,100000 ) :
c=Collatz(I ) )
if c longest:
longest=c
打印(I,c ) ) )。