25 Mart 2016 Cuma

Recursive Fonksiyon - Farklı Bir Örnek


  Recursive fonksiyon örenekleri diye Google amcaya sorduğumuzda karşımıza çıkan sadece bir kaç tür örnek oluyor;recursive fonksiyon ile, faktöryel hesabı ve Fibonacci sayı dizisi yapmak.

  Geçenlerde ihtiyaç duyduğum wordlists dosyasını netten indirmek yerine kendim yapmaya karar verdim.Recursive fonksiyon kullanmam gerektiğine karar verip yaptım.

  Nette de böyle bi eksik olduğunu bildiğim için paylaşma gereği hissettim.

  Recursive fonksiyonun ne olduğundan ziyade yaptığım programın nasıl çalıştığını anlatmak istiyorum.Umarım başarılı olurum.

  Öncelikle ne yapmaya çalıştığımızdan bahsedeyim.Kendisine gelen metne sırayla farklı bir karakter ekleyip 45 farklı metin üreten bir fonksiyon yazacağız.Ardından bu 45 metni tekrar fonksiyona gönderip her birinden 45'er tane daha metin elde edeceğiz.Bu böyle 12 karakterle oluşabilecek  tüm permitasyonlar tamamlanıncaya kadar devam etmeli.

 Sadece 12 karakterle oluşacak metin sayısı; 45^12 (68952523554931640625) tane ve bizim buna ulaşmamız için öncesinde 1,2,3,4,...,11 karakterli metinleri oluşturmuş olmamız gerekiyor.


Wordlist oluşturma mantığı

    Kodu pythonda yazdım,zaten kısa bir kod bakınca python bilmeseniz dahi anlayacağınızı düşünüyorum.

#wordlist.py 
import string

character= string.ascii_lowercase + string.numeric + "."

chtr_list = list(character)

file = open("wordlist.txt","w") 

def harf(text):
    
    if len(text)>12:
        return 0
    else:
        for i in chtr_list:
            new_text = text
            new_text += str(i)
            if len(new_text) >7 :
                file.write("\n"+new_text)
            harf(new_text)


i=""
harf(i)

file.close()

  Kodları tek tek açıklamak gerekirse;


chtr_list = list(character)
 Tüm karakterleri listeye atamış olduk(['a','b','c',...'0','.'] şeklinde ).

file = open("wordlist.txt","w") 
ürettiğimiz metinleri kaydedeceğimiz belgeyi açtık.(belge yoksa yenisini oluştur varsa tamamını silip baştan yazar).

Gelelim fonksiyonumuza;

if len(text)>12:
        return 0

Gelen metnin uzunluğu 12'den büyükse fonksiyonu durdurur.Recursive fonksiyonların olmazsa olmazı; ortamda sürekli aşırıya kaçmaya izin vermeyen arkadaş gibidir.

else:
        for i in chtr_list:
            new_text = text
            new_text += str(i)
            if len(new_text) >7 :
                file.write("\n"+new_text)
            harf(new_text)

  Geldik en önemli kısma;for ile tüm karakterleri tek tek "i"değişkenine atıyoruz.Gelen texti yeni oluşturduğumuz değişkene atıyoruz.Aksi taktirde "ab" geldiğini varsayarsak, "a" eklediğimizde text "aba" olacaktır sonra ki kısımda "abb" yi üretmemiz gerekir ancak metin artık "aba" olacağından bunu yapamayız.

  Yeni değişkenimize her for döngüsünde yeni bir karakter ekleyip sonrasında oluşturduğumuz metinlere tekrar karakter eklensin diye fonksiyonumuza tekrar gönderiyoruz.Yani anlayacağınız fonksiyonun tek yaptığı gelen texte bir harf takıp tekrar kendisine göndermek.

if len(new_text) > 7 ifadesi ise 8 ve 8'den büyük olan metinleri file.write ile dosyaya atıyoruz.

i=""
harf(i)

file.close()
Boş(boşluk değil!) bir metin değişkeni oluşturup fonksiyona atıyoruz.

   Kod üzerinde fazla çalışamadım,fonksiyonun karmaşıklığını azaltacak önerileriniz ,ekleme yapmak istediğiniz yerler veya makalenin şurası fazla olmuş sil dediğiniz yapıcı eleştirilerinizi beklerim.

 Fonksiyonun aynısını başka dillerde yazıp göndermek isterseniz ayrıca mutlu olurum.

  Not:Yorum yapmak için hiç bir şart yoktur.