Solvequill Blog · coding · 3 dk okuma · 10 görüntülenme

İkili arama neden bazen hiç bitmiyor?

Tek karakterlik bir eksik, fonksiyonu bazı girdilerde sonsuza kadar çalıştırıyor. Hatayı bulmanın yolu, aralığın küçüldüğünü kanıtlamaktır.

Yayın tarihi:

Ders yükleniyor…
Bu soruyu Solvequill'in anlattığı ders.

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.

Aynı satırın tekrar etmesi, sonsuz döngünün kanıtıdır.

Ö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:

Küçü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.

Artı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ç

Devam etmek için