Solvequill Blog · coding · 3 dk okuma · 10 görüntülenme
İkili arama neden bazen hiç bitmiyor?
Yayın tarihi:
Soru
Aşağıdaki ikili arama fonksiyonu doğru sonuçlar veriyor gibi görünüyor ama bazı girdilerde asla sonlanmıyor. Hatayı bulunuz, neden sonsuz döngüye girdiğini açıklayınız ve düzeltiniz.
Önce neyi fark etmeli
Bir döngünün biteceğini garanti eden şey, her adımda arama aralığının kesinlikle küçülmesidir. Bu koddaki hata bir mantık hatası değil, bir 'ilerleme' hatası: belirli bir durumda aralık hiç daralmıyor.
Adım adım çözüm
Hatalı kod. İlk bakışta makul görünüyor:
1def ikili_ara(dizi, hedef):2 alt, ust = 0, len(dizi) - 13 while alt < ust:4 orta = (alt + ust) // 25 if dizi[orta] == hedef:6 return orta7 elif dizi[orta] < hedef:8 alt = orta # HATA burada9 else:10 ust = orta - 111 return -1Küçük bir örnekle elle izle. dizi = [1, 3] ve hedef olsun. Başlangıçta alt :
olduğu için alt atanıyor. Ama alt zaten 0'dı. Aralık hiç küçülmedi ve bir sonraki tur birebir aynı hesabı yapacak — döngü sonsuza kadar sürer.
Düzeltme tek kelime: orta zaten kontrol edildiğine göre onu aralığın dışında bırak.
1elif dizi[orta] < hedef:2 alt = orta + 1 # artık aralık her turda küçülüyorArtık her turda ya alt büyüyor ya da ust küçülüyor, yani (ust - alt) kesin olarak azalıyor. Sıfıra ulaşınca döngü biter; sonlanma böyle kanıtlanır.
Cevap
Simetrik tarafta ust = orta - 1 zaten doğru yazılmıştı; hata yalnızca bir kolda olduğu için kod çoğu girdide düzgün çalışıyor ve testlerden geçebiliyor.
Bu soruda en sık yapılan hata
İzlemeyi mi tercih edersin? Yukarıdaki ders her satırı tek tek anlatıyor.
Kendi sorunu açıklamalı videoya dönüştür
Soruyu yaz veya fotoğrafını yükle; Solvequill çözümü adım adım anlatan bir video üretsin.
Solvequill'i aç