Hamming Sayıları

Hamming sayıları, 2,3 ve 5’ten başka diğer asal bölene sahip olmayan dizilerdir. Örnek verecek olursak hamming dizisi şöyledir.

İlk 60 Hamming Sayısı: 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 36 40 45 48 50 54 60… şeklinde gider.

Sıradaki sayının bulunması üç farklı durumdan oluşmakta. Sayı 2’ye bölünebiliyorsa bir sonraki aşamada 2,3 ve 5 dışında böleni olmayacak. Örneğin şöyle izah edilebilir.

hamming_numbers.py

Bu sayede artık var olan sayı elimizdeki dizideki sayılardan birisi durumunda. Örneğin 60/2 sonuç olarak 30 veriyor. Diziye baktığımızda 30’dan büyük ilk sayımız 32. Buna göre 2×32=64 olmakta. Yani 60’tan sonra sayı 2’ye bölünebiliyorsa bu da 2×32=64 olacaktır. Bu durum 3 ve 5 için de yine aynı şekilde anlaşılmaktadır.

Ben 9830’a kadar olan sayıları bulmak istedim. Tabii 9830 kafama göre değildi. İlk stackoverflow hatasını alacağım noktayı aramam uzun sürmedi.

O durumda aldığım hata Python: Maximum recursion depth exceeded hatası di. Yani yineleme derinliğinin aşıldığına dair bir hata mesajı.

Bunun için sys modülünü kullanarak izin verilen recursion aralığını değiştirebiliriz.

setrecursionlimit yineleme limitini belirlemekte kullanılır. Biz bu denememizde özyinelemeli işlev kullandık. Bu özelliği threading modülünün stack_size işlevini kullanarak yükseltebilirsiniz. Var olan limiti yukarıdaki kodda görebiliriniz. getrecursionlimit özelliği size bu değeri verecektir.

hamming_numbers.py

Bu da 9830. sayıya kadar olanları yazdırmayı denediğim profile sonucu:

python -m profile hamming_numbers.py

Kaynaklar:

http://stackoverflow.com/questions/8177073/python-maximum-recursion-depth-exceeded

http://stackoverflow.com/questions/25064781/python-hamming-number-explanation

http://codegolf.stackexchange.com/questions/7/hamming-numbers

http://en.wikipedia.org/wiki/Regular_number