Girilen sayının Güçlü (1! + 4! + 5! = 1 + 24 + 120 = 145) olup olmadığını bulan program?

Merhabalar bu soruyu fonksyon kullanarak basit bir şekilde anlatabilir misinix ? Girilen sayının Güçlü (1! + 4! + 5! = 1 + 24 + 120 = 145) olup olmadığını bulan program?

Önce input fonksiyonunu kullanarak kullanıcıdan bir girdi alalım.

sayı = input("Bir sayı giriniz: ")

Bir faktöriyel fonksiyonu tanımlayalım. Bu fonksiyon aldığı sayıyı kendisine kadar olan kendinden küçük bütün doğal sayılarla çarpacak. Bu işi yapmak için döngüleri kullanmalıyız. Python’da 2 tane döngü çeşidi var. while döngüsü kendisine verilen ifade True çıktısını verene kadar çalışır. for döngüsü kendisine verilen listedeki bütün değerleri döngüde kullandıktan sonra biter. Daha ayrıntılı bilgi için kitaptaki döngüler kısmına bakabilirsiniz.

Önce faktöriyel fonksiyonunu tanımlayalım:

def faktoriyel(son_sayı):

Bu ifade Python’a birazdan faktöriyel isimli bir fonksiyon tanımlayacağımızı söylüyor. Parantez içinde verdiğimiz son_sayı bu fonksiyonu her çağırdığımızda kullanacağımız değişkenleri Python’a söylüyor.

Biz bu fonksiyonu bir makine olarak yazıyoruz. Bir faktöriyel makinesi. Bizim içine koyduğumuz sayı(son_sayı) değişecek. Makinenin verdiği cevap sayıya göre değişecek. Ama makinenin yaptığı iş değişmeyecek.

Faktöriyel işlemini normalde nasıl yaparız? 1’den sayının kendisine kadar olan kendisi dahil bütün sayıları çarparız:

6! = 1*2*3*4*5*6 #720

Her seferinde bu işi elle yapmak yerine bir döngü tanımlayalım. Elimizdeki her iki döngü çeşidi ile bu işi yapabiliriz. while döngüsüyle bu işi yaparsak daha az fonksiyon kullanırız.

Önce bütün sayılarla çarpacağımız bir sonuç değişkeni tanımlayalım. Bu değişkenin başlangıç değeri 1 olmalı. Çünkü 1 çarpmada etkisiz eleman ve sonucun bu sayıdan etkilenmesini istemeyiz.

sonuc = 1

Şimdi bir değişken daha tanımlayalım. Bu değişkeni döngü boyunca birer birer artıracağız ve bu değişkenin değeri sayıyı geçtiği anda döngü bir daha çalışmayacak. Programlamada genellikle bu değişken için i ismi tercih edilir. Altın standarttır. Başka bir değişken için de tek harften oluşan isim kullanılması hoş karşılanmaz.

i = 1

Bu değişkenlerin her ikisini de başlangıçta bahsettiğimiz fonksiyonun içinde tanımlayacağız. Fonksiyonumuz şu hâle geldi:

def faktoriyel(son_sayı):
    sonuc = 1
    i = 1

Fonksiyonu yazarken girintileri koymayı unutmayın. Girintiler Python’da gelenek olarak 4 boşluktan oluşur. İki nokta ile başlayan her ifadeden sonra girinti bir kat daha artar. Mesela def ile bir fonksiyon tanımladınız. Sonraki ifadeler 4 boşluk bırakılarak yazılır. Fonksiyon tanımlamanız bittiği anda girintiyi bir kat azaltırsınız. Fonksiyonun içinde bir döngü açtığınızda ki şimdi yapacağız. Girinti bir kat daha artar ve 8 boşluk koyarsınız. Onun içinde bir döngü daha tanımlarsanız girinti yine artar ve 12 boşluk olur.

Artık bahsettiğimiz döngüyü yazmaya başlayabiliriz. while döngüsü olacağını ve while döngüsün bir ifadeyi kontrol ettiğini, bu ifade True çıktısı verdiği sürece çalıştığını söylemiştim. Bizim kontrol edeceğimiz ifade i değişkeni ile son_sayı değişkeninin kıyası olacak. Döngümüz i değişkeni son_sayı değişkeninden küçük veya son_sayı değişkenine eşit olduğu sürece çalışacak.

Temel algoritmaya tekrar bakalım. Eğer 6 sayısının sayısının faktöriyelini hesaplamak istersek son_sayı değişkeni 6 değerini alacak ve i değişkeni başlangıçta 1 değeri ile başlayacak. Biz i değişkeninin değerini sonuc değeri ile çarpacağız. Sonra i değişkenine 1 ekleyip kontrol edeceğiz. Eğer i değişkeni son_sayı değişkeninden küçük veya son_sayı değişkenine eşitse döngüye devam edeceğiz. Bizim senaryomuzda şu an i değişkeni 2 ve son_sayı değişkeni 6. Bu durumda döngümüz çalışmaya devam edecek. 2 ile sonuc değişkenini çarpacağız ve sonuc değişkenine atayacağız. Tekrar i değişekninin değerini bir artıracağız ve tekrar kontrol edeceğiz. Döngü ta ki i değişkenin değeri 7 olana kadar böyle devam edecek. 7 değerine ulaştığında kontrol aşamasında while, “Dur” diyecek. Döngü kırılacak ve döngüden sonraki işlemler devam edecek.

Açıklaması bu kadar uzun ve karmaşık görülen kod aslında bu karmaşık değil.

Sırada bir döngü tanımlamak var. Tanımımız önce while sonra "i değişkeni son_sayı değişkeninden küçük veya son_sayı değişkenine eşit mi?" şeklinde olacak. Eğer karşılaştırma işlemlerini bilmiyorsanız kitaptan ilgili bölümü okuyabilirsiniz.

while i <= son_sayı:

Döngünün içinde 2 işlem yapacağız. Biri i değişkenini sonuc değişkeni ile çarpıp çarpımı sonuc değişkenine kaydetmek. Burada “kaydetmek” adında ufak bir ayrıntı var. Siz şu işlemi yaparsanız sadece çarpmış olursunuz:

sonuc * i

Python bu işlemi yapar. O kadar. Sizin sayılarınız çarpılmış olur. Yoldan geçen bir adamı durdurup bu iki sayıyı çarptırmanızdan hiçbir farkı yok. O adam için de bu iki sayının bir önemi yok Python için de. Ancak bu çarpımı bir değişkene kaydederseniz anlamı olur.

sonuc = sonuc * i

Böylece döngünün yapacağı işin yarısını Python’a söyledik. İkinci işlem i değişkeninin değerini 1 artırmak. Bu bir önceki işlemden daha sade. i değişkenine 1 ekleyip i değişkenine kaydedeceğiz.

i = i + 1

Eğer i değerini artırmazsak kontrol ve çarpım işlerimizde sonsuza dek 1 değerini kullanan bir döngü elde ederiz. Döngü asla bitmez ve sonuc değişkeninin değeri de asla değişmez.

Döngümüzün son haline bakalım. Dikkatli bakarsanız döngüyü tanımlarken de iki nokta kullandık. Yani döngünün içine yazdığımız ifadeler bir kat girintili olarak yazılacak:

while i <= son_sayı:
    sonuc = sonuc * i
    i = i + 1

Aslında fonksiyon yazmasaydık şu anda elimizde faktöriyel hesaplayan bir program olurdu.

son_sayı = 6
sonuc = 1
i = 1
while i <= son_sayı:
    sonuc = sonuc * i
    i = i + 1

Bu programda son_sayı değişkenine istediğiniz değeri vererek faktöriyel hesabı yapabilirsiniz. Tabi ki bunun çok daha kısa yazımları var. Ancak yeni başlayan birinden en temel olarak bu tarzda bir fonksiyon beklenir. (Ben bu kodların hiçbirini test etmeden ezberden yazıyorum. Test etmenizde fayda var. :penguin: Saatin gece 12.30 olmasından mütevellit hata olma olasılığının yüksek olduğuna inanıyorum.

Gel çocuk! Az bir işimiz kaldı.

Biz başlangıçta fonksiyon yazacağız, dedik. Fonksiyonun girdisi olarak bir değişken aldık. Çıktı olarak da bir sayı vereceğiz, dedik. Başından beri faktöriyeli hesapladığımız değişken olan sonuc değişkeninin değerini geri döndürelim. Eğer bu ifadeyi anlamazsan kısaca google’layabilirsin.

return sonuc

Bu ifade fonksiyonumuzda while döngüsünden sonra gelecek ve fonksiyonumuz bu ifade ile bitecek. Fonksiyonun tüm halini görelim bu sırada while döngüsünün içinde kalan şeylerin 2 kat girintili yani 8 boşluklu yazıldığına dögü bittikten sonra gelecek olan ifadelerin tekrar tek girintili yazıldığına dikkat edelim.

def faktoriyel(son_sayı):
    sonuc = 1
    i = 1
    while i <= son_sayı:
        sonuc = sonuc * i
        i = i + 1
    return sonuc

Biraz önce program diye size verdiğim kodun fonksiyon halini yazdık. Bunu çalıştırmak için fonksiyonu bir değişkenle çağırmak yeterli.

faktoriyel(6) #720

Şimdi elimizde faktöriyel fonksiyonu olduğuna göre güçlü sayılar için uğraşmaya başlayabiliriz. Biz en başta input ile sayı değişkenine bir ifade almıştık. Bu ifade bize bir liste veriyor. Sayının her karakterini tek tek ve sırayla içeren bir liste. Yine başlarda 2 tane döngümüz olduğunu ve birinin ifadeyi kontrol ederek diğerinin listedeki değerleri kullanarak çalıştığını söylemiştim. while döngüsünü zaten kullandık. Onun kendisine verilen ifadeyi nasıl kontrol ettiğini gördük. Şimdi for döngüsü ve sayı karakter dizisini kullanarak kodumuza devam edelim.

Buradan sonra yazacağımız kodları fonksiyon içine değil altına yazacağız. Hatta başa yazacağımız input fonksiyonunu da sona alalım. İlerideki toplu kodlarda da öyle göstereyim.

İlk önce toplamı tutacağımız yeni bir değişken oluşturalım. Bu değişkenin adı toplam olsun. Başlangıç değeri de toplamanın etkisiz elemanı olan 0 olsun. Faktöriyel hesaplarımızı bu değişkende toplayalım.

toplam = 0

for döngüsünde yine bir i değişkeni tanımlayacağız. Bu sefer biz değişkenin değerini hiçbir şekilde değiştirmeyeceğiz. Bütün değişiklikleri for döngüsü kendisi yapacak.

Şimdi Python’ın kafasını anlatacağım. Kafan karışabilir sadece kabul etmeni bekliyorum. ["1", "4", "5"] ve "145" aynı şey. Ama "145" bir sayı değil. "145" bir karakter dizisi. Zaten ["1", "4", "5"] de "145"in liste şeklinde gösterimiyle elde ediliyor. Biz eğer faktöriyel fonksiyonumuza direkt input'tan elde ettiğimiz sayı değişkenini verirsek hata alırız. sayı değişkenini int fonksiyonuna vermeliyiz. Bu int fonksiyonu içine koyduğun karakter dizilerini Python’ın dilinde sayıya dönüştürüyor. Yani "145" bir sayı değilken int("145") bir sayıyı temsil ediyor. Aslında int("145") ile 145 aynı şey. Dışarıdaki tırnak işaretleri ortalığı karıştırıyor.

Kafan karıştıysa bırak öyle kalsın. Birkaç saat ya da gün sonra kitaptaki şu bölümü okuyarak daha iyi anlayabilirsin. Şimdi de okuyabilirsin pekâlâ. Tercih senin.

Gel for döngüsüne tekrar dönelim. Döngümüze liste olarak sayı değişkenini verelim ve her çalıştığında bize değişik bir i değişkeni versin. Türkçede böyle ifade ettiğimiz şeyi Python’a şöyle söyleyince anlıyor:

for i in sayı:

Bu döngü boyunca her aldığımız i değeri bir karakter olacak ve biz o değeri kullanmadan önce int fonksiyonunu kullanarak sayıya dönüştürmeliyiz.

Döngü boyunca yapacağımız tek bir işlem var. toplam değişkenine i değişkeninin faktöriyelini ekleyip toplam değişkenine tekrar kaydetmek. Döngü bittiğinde bütün i değerlerinin faktöriyellerinin toplamını elde etmiş olacağız.

Önce i değişkenini sayıya dönüştürerek başlayalım.

int(i)

Şimdi faktöriyelini hesaplayalım. Bu işlem için uzunca bir süre uğraşıp fonksiyon yazdığımız çağıracağız.

faktoriyel(int(i))

Unutmayalım Python fonksiyonları içeriden dışarıya doğru çağırıyor. Yani önce int sonra o fonksiyondan elde ettiği çıktı ile faktoriyel fonksiyonu çalışacak.

Hemen elde ettiğimiz bu değeri toplam değişkenine ekleyelim.

toplam + faktoriyel(int(i))

Daha önce de açıkladığımız gibi bu işlemi kaydetmediğimiz sürece hiçbir anlamı yok. Hemen kaydedelim.

toplam = toplam + faktoriyel(int(i))

Fonksiyondan sonra yazdığımız kısmı hemen toparlayalım.

sayı = input("Bir sayı giriniz: ")
toplam = 0
for i in sayı:
    toplam = toplam + faktoriyel(int(i))

Bitti sayılır. :slight_smile:

Eğer ilk başta girilen ifade ile bizim ulaştığımız toplam aynı ise başta verilen sayı güçlüdür. Farklıysa güçlü değildir. Bunu kontrol etmek için de Python’daki if ve else deyimlerine danışacağız. Hemen kitaptan link bırakalım. Direkt olarak kodu tamamlıyorum. Keza buradaki kodda en temel hâliyle bu deyimleri kullanıyoruz.

if toplam == int(sayı):
    print("Güçlü sayı")
else:
    print("Güçlü değil")

Kodun toplu hâlini vermek onca şeyi yazdıktan sonra benim çok vaktimi almaz. Ama okuyup onu çıkartmak da senin görevin olsun.

Saat 01.30’a gelirken yazımı bitiriyorum. Arada dediğim gibi hiçbir kodu test etmedim. Hatta yazdığım ifadelerde de hata olabilir. Aylardır foruma girmiyordum. Cevap vermek için geleceğimi de sanmıyorum. Dilim döndüğünce açıklamaya çalıştım. Ancak seviyenizi bilmediğim için ancak bu kadar oldu.

2 Beğeni