2009
01.20

Python ile cebelleştiğim şu günlerde, Qbasic ile yaptığım bazı minik programları değerlendiriyordum. Qbasic ile yazdığım küçücük programı şuydu:

faktoriyel
Bir faktoriyel hesaplayan mini bir program yapmıştık. Faktöriyel nedir bilmeyenlere:

Faktöriyel genellikle permütasyon,kombinasyon işlemlerinde kullanılan ve ünlem(!) işaretiyle gösterilen bir işlemdir. Eğer 4! derseniz bu 4.3.2.1=4! eşit olur. Bu da 4!=24 olmuş olur.

Burası işin hikaye kısmı oluyor. Bize program için gerekli olan x değerini 1′den x kadar kendisiyle çarpacak bir döngü yazmak gerekiyor. Qbasic’de gördüğünüz gibi “For, Next” döngüsü için Python’da bir eş değer bir döngü bulamadım. Python’daki “For” döngüsü benim istediğim bir döngü çıkmadı. Ve biraz uğraş, kılavuzlar, web siteleri karıştırdıktan sonra küçük bir “While” döngüsüyle bu olayın yapılabileceğini görmek Python’a ilgimi arttırdı. Döngü ve sonuç ise şöyledi:

faktoriyel2

Sonuç gördüğünüz gibi çok hoştu. Eski bir yazımda Qt-twit adlı bir programımdan bahsetmiştim. Onu paketlemiş ve bir .pisi paketi oluşturmuştum. Pisi paketlemeyi biliyordum. Siz konsoldan “faktor” diyorsunuz hemen faktöriyel işlemini bilgisayara bırakıyorsunuz.

Gelelim indirmeye:

Pisi paketini buradan, kaynak paketini buradan ve eski pisi yazısına buradan ulaşabilirsiniz.

Birkaç Ayıp: Türkçe’yi Faktöriyel yerine Faktöriyle yazarak felç etmek, 0 yazılınca programın aptalca 1 denemesi, Pisi paketini oluştururken gidip eski xml dosyalarını kullanmak, eski qbasic projesine bakıp aynısı python’da deneyip “Tüh be ulen!” diye aptalca bağırmak, eski projenin sayfasını kullanmak …. (Birkaçı geçti gidiyor :)

Programı böyle birşey indirmeden direk kopyala yapıştır yaparak denemek isteyenler ise hemen şuradan kopyalayabilirler.

Benzer yazılar:

  1. C++’de Faktöriyel
  2. Python 3.0 Pardus'da Çalışıyor!
  3. Python 3.0 ve Pardus?
  4. İlk Pisi Paketimi Yaptım!
  5. Firefox Pardus'da hata veriyor!

8 yorum yapılmış.

Yorumla!
  1. Öncelikle, kullanıcıdan bir değer alacaksanız, input() yerine raw_input() kullanın, daha güvenli (bununla ilgili bir sürü makale var internette ama şu kadarını söyleyeyim, input()’a kullanıcının girdiği değer programın bir parçası gibi işlem görür (basitçe açıklamak gerekirse).
    İkincisi, input() ile aldığınız katarı (örneğin “15″) bir sayıya dönüştürmelisiniz (örneğin 15). Bunun için int() kullanılır.
    Üçüncüsü, bir sayıyı her seferinde belli bir miktar artırarak bir işlem yapacaksanız (yani sayaçlı bir döngü kuracaksanız), range() veya xrange() kullanabilirsiniz. Python belgelerinden detaylarını öğrenebilirsiniz.
    Kullanıcı sayı girmediğinde program pörtleyeceği için bir kancayla durumu denetlemek gerekir. Bunun için try..except kullanılır. Bunu biraz araştırın derim.

    Bu küçük kodu biraz güzelleştirmek gerekirse:
    sayi = int(raw_input(“Sayı:”))
    fakto = 1
    for sayac in range(2,sayi+1):
    fakto = fakto * sayac
    print fakto

    Bu koda bir de sayıyı almak için try..except ile bir while döngüsü koyup 1 veya üstünde bir pozitif sayı alana kadar da döndürürsen, popüler tabirle “dadından yenmez”.

  2. Ben input() kullanırken sanki onun integer bir ifadeyi kullanıcıdan almak üzere yazıldığını düşündüm. raw_input() ise sadece string ifadeler için kullanıldığını düşünüyordum. Bu arda for döngüsünü range ile denemeye çalıştım fakat sizin örneğiniz ile gösterirsem: for fakto in range(1,Sayi) böyle bir ifade kullanmıştım. Fakat çözüme ulaşamadığım için while döngüsünü denedim. Bu arada try,except hakkında biraz araştırma yapmamda cidden fayda var. Yorumun için teşekkür ederim. Python öğrenmeye devam :)

  3. bu is icin rekursif bakis acisi pek performans vaad etmiyor ama list comprehension ile birlesince tek satirda cok $ukela gorunuyor.

    def hede(x):
    return (1 if x==0 else x * hede(x-1))

    gibi.

  4. Açıkcası biraz daha çalışmam gerek diyorsunuz tamam çalışırız :)

  5. Özyinelemeli yapıyı daha karmaşık ve özyinemenin zorunlu olduğu işler için kullanmakta fayda görüyorum.

    @uic ayrıca orada x==0′daki 0 yerine 1 yazarsak bir derece kısaltmış oluruz olayı, hatta 1 değil de return(2 if x==2 else x*hede(x-1)) diyerek daha da kısaltmak mümkün sanıyorum. Sonuçta x==0 ve x==1 için 1 döndürmek gerekiyor, falan filan.. Maksat eniyileştirme olsun :)

  6. zaten buyuk sayilarda iteratif yapinin ozyinemeli yapiya performans konusunda fark atiyor olmasi lazim. neyse, lambda ornegini kim verecek? :)

  7. Ben vermeyeceğim, hiç sevmem kendisini. Cümleleri karıştırmaktan ve daha az okunaklı hale getirmekten başka bir işe yaramadığını düşünüyorum (ki bir kodun tek bir satıra sığdırılabilmesini üstün bir özellik olarak görmenin diğer programlama dilleriyle ****** yarıştırmaktan başka birşey olmadığını da biliyoruz).

  8. @Necmettin öhm öhm öhm! :)