Çözüldü Python kodu neden çalışmıyor?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

asmuratgg

Zeptopat
Katılım
24 Temmuz 2024
Mesajlar
2
Daha fazla  
Cinsiyet
Erkek
Kod:
def d:
 İf n ==0:
 Return 0
 k = int(n ** (1 / 3))
 return D(n - k ** 3) + 1
print(D(1000))

Bu kod neden 1 çıktısını vermiyor?
Çünkü:

Kod:
ilk çağrı: D(1000)
k hesapla: K = int(1000^(1/3)) = int(10) = 10.
k^3 = 10^3 = 1000.
Özyinelemeli çağrı: D(1000 - 1000) + 1 = D(0) + 1
d(0) 0 döndüğü için, D(1000) = 0 + 1 = 1 olur.
Ama 5 çıktısını alıyorum

Amacım n sayısının en az kaç tane kup sayının toplamı olduğunu bulmak, örneğin 36 = 27+8+1 çıktı = 3
 
Çözüm
Bu kod neden 1 çıktısını vermiyor?

n ** (1 / 3) işlemi, ondalık sayılarla yapılan bir işlem ve dolayısıyla tam istediğiniz sonucu elde edemeyebiliyorsunuz. Tıpkı şuradaki gibi bir durum yaşanıyor:

Kod:
>>> 0.1 + 0.2
0.30000000000000004

Bu durum, ondalık sayıları bilgisayarın tutma şeklinden yani donanımsal kısıtlardan kaynaklanıyor. Şurada detayları okuyabilirsiniz.

Gerçekten de 1000 ** (1 / 3)'ün 10'a çok yakın ama 10 olmadığını görebiliriz:

Kod:
>>> 1000 ** (1 / 3)
9.999999999999998
>>> int(1000 ** (1 / 3))
9

Sonucun 10'dan küçük gelmesini şu duruma bağlayabiliriz:

Kod:
>>> print(f"{1/3:.100f}")
0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000

Görüldüğü üzere sonuç 0.3 devirli sayısından küçük.

Bunun üstesinden gelmek için round() fonksiyonunu kullanabilirsiniz, en yakın tam sayıya yuvarlar:

Kod:
>>> round(1000 ** (1 / 3))
10
>>> int(round(1000 ** (1 / 3)))
10

Pek gerekmiyor ama sonucu daha da kesinleştirmek için şöyle bir yardımcı fonksiyon kullanılabilir:

Python:
def precise_cbrt(n: int) -> int:
    res = int(n ** (1 / 3))
    while (res + 1) ** 3 <= n:
        res += 1
    while res**3 > n:
        res -= 1
    return res

round yeterli olacaktır.
Bu kod neden 1 çıktısını vermiyor?

n ** (1 / 3) işlemi, ondalık sayılarla yapılan bir işlem ve dolayısıyla tam istediğiniz sonucu elde edemeyebiliyorsunuz. Tıpkı şuradaki gibi bir durum yaşanıyor:

Kod:
>>> 0.1 + 0.2
0.30000000000000004

Bu durum, ondalık sayıları bilgisayarın tutma şeklinden yani donanımsal kısıtlardan kaynaklanıyor. Şurada detayları okuyabilirsiniz.

Gerçekten de 1000 ** (1 / 3)'ün 10'a çok yakın ama 10 olmadığını görebiliriz:

Kod:
>>> 1000 ** (1 / 3)
9.999999999999998
>>> int(1000 ** (1 / 3))
9

Sonucun 10'dan küçük gelmesini şu duruma bağlayabiliriz:

Kod:
>>> print(f"{1/3:.100f}")
0.3333333333333333148296162562473909929394721984863281250000000000000000000000000000000000000000000000

Görüldüğü üzere sonuç 0.3 devirli sayısından küçük.

Bunun üstesinden gelmek için round() fonksiyonunu kullanabilirsiniz, en yakın tam sayıya yuvarlar:

Kod:
>>> round(1000 ** (1 / 3))
10
>>> int(round(1000 ** (1 / 3)))
10

Pek gerekmiyor ama sonucu daha da kesinleştirmek için şöyle bir yardımcı fonksiyon kullanılabilir:

Python:
def precise_cbrt(n: int) -> int:
    res = int(n ** (1 / 3))
    while (res + 1) ** 3 <= n:
        res += 1
    while res**3 > n:
        res -= 1
    return res

round yeterli olacaktır.
 
Çözüm
Python:
def d:
 İf n ==0:
 Return 0
 k = int(n ** (1 / 3))
 return D(n - k ** 3) + 1
print(D(1000))


Öncelikle kodun aynen böyleyse bir sürü yanlış var. Fonksiyonu "D" ile çagırmışsın ancak fonksiyonun "d" ve fonksiyon tanımlarken () kullanımı yapmamışsın. Programlama dillerinin çogu büyük küçük harflere duyarlıdır. 2. satırda "if n== 0" ise sanırım 0 dönmek istemişsin ancak if blogunun altında herhangi bir komut yok. Pythonda blokların altına özel komutlar koymak için o satırın altına gidip girinti (boşluk) bırakmamız gerekiyor. Yani programa ne girersen gir if sorgusuna bakıp direkt return 0 oluyor (ve Return 0 degil return 0 olmalı programı nasıl bu şekilde çalıştırıp 5 çıktısını almışsın anlamadım hata vermesi lazımdı sanırım kodu yanlış attın buraya). Kodun yazım olarak dogru hali :

Python:
def D():
    if n ==0:
         return 0
    k = int(n ** (1 / 3))
    return D(n - k ** 3) + 1
   
   
print(D(1000))
 
Büyük küçük harf hataları siteye kodu geçirirken oldu , koddaki hata 1000**1/3 ü 10 olarak değil 9.9999 olarak hesaplamasıymış, yazım hatasından dolayı konunun otomatik kapandığını düşünmüştüm, ama açıkmış, sorun dediğim gibi.
 
Büyük küçük harf hataları siteye kodu geçirirken oldu , koddaki hata 1000**1/3 ü 10 olarak değil 9.9999 olarak hesaplamasıymış, yazım hatasından dolayı konunun otomatik kapandığını düşünmüştüm, ama açıkmış, sorun dediğim gibi.
Evet tahmin etmiştim ben sadece yazım hataları olduğundan konuya yabancı arkadaşlarda bakarsa yanlış bilgi edinmemeleri açısından yazmak istedim. Mantığını üstte hocam anlatmış zaten.
 

Technopat Haberler

Geri
Yukarı