3.
1+3 > 3
Pozitif oldugunu varsayiyorum. Negatif sayilarin tamami zengin.
3.
1+3 > 3
Pozitif oldugunu varsayiyorum. Negatif sayilarin tamami zengin.
Kendisi hariç bölenleri
Ay, dogru.
Genelde bolen olarak 1 kullanilmaz ya, ona takildi kafam.
Zaten bütün sayılar zengin olur o zaman
945?
def en_kucuk_zengin_sayi():
s = 0
while True:
s += 1
if (
s % 2 != 0
and
sum(filter(lambda i: s % i == 0, range(1, s))) > s
):
return s
print(en_kucuk_zengin_sayi())
Hocam merhaba. Yazdığınız programda and ifadesinde sum and s%2==0
şeklinde bir kontrol yapmışsınız. Bunu görünce aklıma gelen şey şu oldu. Hatırladığım kadarıyla, bazı programlama dillerinde eğer and
koşulu yürütülüyorsa ilk olarak birinci koşula bakılır, eğer ilk koşul 0
döndürüyorsa ikinci koşul hiç çalıştırılmaz. Dolayısıyla ekstra bir hız sağlanmış olur. Çünkü biliyorsunuz and işlecinde 0, tüm koşulu 0 yapar. Bu yüzden and
koşulunda göreceli olarak daha çok iş yapan ifade sağ tarafa koyulur. Örneğin a
ve b
işlemlerinden a
daha çok zaman alan bir işlem yapıyorsa
if(b and a):
...
şeklinde yazılır. Böylece b
koşulu 0 olarak dönerse a
koşuluna bakılmaz. Sizin kodunuz hızlı çalışıyor, ama sum()
fonksiyonu göreceli olarak bölme işleminden daha çok zaman harcıyor. Şu şekilde yazılınca küçük de olsa bir hız farkı görülebilir sanırım.
if (
s % 2 != 0
and
sum(filter(lambda i: s % i == 0, range(1, s))) > s
):
Tabi bu aklımda kalan bir konuydu. Sizin kodunuzda gördüğüm için dile getirmek istedim, yanlış anlamayın Doğru olup olmadığı ile ilgili bir bilgisi olan varsa ve paylaşırsa memnun olurum
Denemek için basit bir program yazdım.
import timeit
kod1="""
def get_list():
list(range(10000))
return 1
for i in range(1000):
if(i%2 and get_list()):
pass
"""
kod2="""
def get_list():
list(range(10000))
return 1
for i in range(1000):
if(get_list() and i%2):
pass
"""
print(timeit.timeit(kod1,number=10))
print(timeit.timeit(kod2,number=10))
Çıktı:
2.846628731999772
5.378357662999861
Yukarıdaki iki kod bloğu da aynı işi yapıyor. Tek fark if ifadesi içerisindeki ifadelerin yerlerinin değiştirilmiş olması. Görüldüğü gibi, zaman alan işlem sola koyulunca yarı yarıya daha çok zaman harcamış oluyor programımız.
Merhaba @coderistan kardeşim.
Doğru söylüyorsunuz. Dikkatiniz için teşekkür ederim. İlgili satırların yerlerini değiştirdim.
Bu tür sorular hoşunuza gidiyorsa elimde çok var.
Siz sorularınızı sorun lütfen, cevap vermek isteyecek birileri çıkar diye düşünüyorum. Hem bir sorudan (yukarıdaki soruda olduğu gibi) soruyla ilgisi olmayan yeni şeyler de öğrenebiliriz.
Ben de bir katkıda bulunayım.
s % 2 != 0
şeklinde kontrol etmek yerine
s = 1 den başlatıp s +=2 diye gitseniz?
O da olur. İlk iki kodun çalışma sürelerinin oranı aşağı yukarı ikiydi. Sizin önerdiğiniz kod ile @coderistan’ın önerdiği kod arasındaki çalışma süreleri oranı 1’e oldukça yakın. Ama sizin önerdiğiniz yaklaşıma göre işlem daha kısa sürede gerçekleşti.
>>> (lambda: next(i for i in __import__("itertools").count(1, 2) if sum(j for j in range(1, i) if not i%j) > i))()
945
generator’lardan da böyle değer döndürebiliyoruz
Tekrar herkese merhaba,
Cevaplarınız için hepinize teşekkür ederim.
Bir süre forumdan uzak kaldım.
cevaplarınızı incelemek ve yeni şeyler öğrenmek oldukça faydalı oluyor.
Bu tür sorular hoşuma gidiyor, paylaşırsanız sevinirim…
@coderistan mesajınız için teşekür ederim, benim gibi acemi kullanıcılar için ufuk açıcı ve faydalı bir mesaj oldu.