Yorumda da dedigim gibi daha onceki hesaplari hafizaya atma islemleri kisaltir.
Mathematica da bu soyle yapiliyor.
f[x_]:=istenilen fonksiyon (*normal fonksiyon tanimlamak icin*)
f[x_]:=f[x]=istenilen fonksiyon (*hafizali fonksiyon tanimlamak icin*)
Surdaki kod diziyi degilde sadece dizilerin uzunluklarini hesapladigi icin, bize de bu gerekli zaten, baya hizli: Yaklasik $1$ saniyede en uzun dizinin uzunlugunu buluyor: $525$
collatzLength[n_Integer] := collatzLength[n] = If[EvenQ[n], collatzLength[n/2], collatzLength[3*n + 1]]
AbsoluteTiming[1 + Max[collatzLength /@ Range[1000000]]]
{1.0798, 525}
Soru hangi sayi icin en uzun dizi elde edilir diye sormus, kodu birazcik degistirirsek, cevabi $837799$ olarak buluruz.
AbsoluteTiming[Last[Ordering[collatzLength /@ Range[1000000] - 1]]]
{1.82749, 837799}
Surda baslanilan her sayinin, agacin dallarindan govdesine gitmesi misali, $1$'e gittigini gosteren bir grafik var.