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 1if i == len(values) or left < 0:return 0take = 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.