İçeriğe atla
CodeItRaw
Özyineleme & Böl-Yönet

Ders 3/3

Bazı problemlerde her adımda bir seçim vardır: bu elemanı al ya da alma, buraya açan parantez koy ya da kapatan. Özyineleme iki seçeneği de dener: her biri için kendini bir kez çağırır. Çağrılar artık bir zincir değil, bir ağaçtır.

def count(values, i, left):
if left == 0:
return 1
if i == len(values) or left < 0:
return 0
take = count(values, i + 1, left - values[i])
skip = count(values, i + 1, left)
return take + skip
values[i]'yi alırsan hedef o kadar küçülür, almazsan aynı kalır; iki durumda da bir sonraki elemana geçilir. Bu sürüm yolları sayıyor; "var mı?" sorusu için take or skip döndürürsün.

Bedeli büyüktür: her eleman çağrı sayısını ikiye katlar. 20 eleman bir milyon, 30 eleman bir milyar çağrıdır. Bu yüzden dallanan özyinelemede iki soru önemlidir: bir dalı erken kesebilir miyim (hedef eksiye düştüyse devam etme), ve aynı alt problemi tekrar tekrar mı çözüyorum? İkincisinin cevabı Dinamik Programlama konusudur.

Görevler

Görevler sırayla açılır. Hepsini çözünce sonraki ders açılır.

Bu dersin görevleri, önceki dersler bitince açılır. Anlatımı şimdiden okuyabilirsin.

  1. 01

    Çatallanan Çağrılar

    Kod Okuma · Big-O Oku

  2. 02

    Dengeli Parantezler

    Fonksiyon

  3. 03

    Alt Küme Toplamı

    Fonksiyon

Sırayı beklemeden çözmek istersen bütün problemler kilitsiz açık: Problemler listesi