Eski, iyi bilinen bir sorunu düşünün :
Matematikte, iki veya daha fazla sıfır olmayan tam sayının en büyük ortak bölencisi (gcd)… sayıları kalansız bölen en büyük pozitif tam sayıdır.
Gcd'nin tanımı şaşırtıcı derecede basittir:
burada mod, modulo operatörüdür (yani, tamsayı bölmesinden sonra kalan).
İngilizcede bu tanım herhangi bir sayının en büyük ortak böleni diyor ve sıfır bu sayı ve iki sayının en büyük ortak böleni olan m ve n en büyük ortak böleni olan n ve bölünmesi sonucu kalan m tarafından n .
Bunun neden işe yaradığını öğrenmek istiyorsanız, Öklid algoritması hakkındaki Wikipedia makalesine bakın .
Örnek olarak gcd (10, 8) 'i hesaplayalım. Her adım, kendisinden hemen önceki adıma eşittir:
- gcd (10; 8)
- gcd (10; 10 mod 8)
- gcd (8; 2)
- gcd (8, 8 mod 2)
- gcd (2, 0)
- 2
İlk adımda 8 sıfıra eşit olmadığından tanımın ikinci kısmı uygulanır. 10 mod 8 = 2, çünkü 8, 2'nin kalanıyla bir kez 10'a giriyor. 3. adımda, ikinci kısım tekrar uygulanır, ancak bu sefer 8 mod 2 = 0 çünkü 2, 8'i hiç kalmadan böler. 5. adımda, ikinci bağımsız değişken 0'dır, dolayısıyla cevap 2'dir.
Gcd'nin eşittir işaretinin hem sol hem de sağ tarafında göründüğünü fark ettiniz mi? Bir matematikçi bu tanımın yinelemeli olduğunu söyler çünkü tanımladığınız ifade , tanımının içinde yinelenir .
Özyinelemeli tanımlar zarif olma eğilimindedir. Örneğin, bir listenin toplamı için özyinelemeli bir tanım,
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
head
bir listedeki ilk öğe nerede ve listenin tail
geri kalanı. Not sum
sonunda tanımı içinde tekrarlanır.
Belki bunun yerine bir listedeki maksimum değeri tercih edersiniz:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
Negatif olmayan tamsayıların çarpımını bir dizi eklemeye dönüştürmek için yinelemeli olarak tanımlayabilirsiniz:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Çarpmayı bir dizi eklemeye dönüştürmekle ilgili bu kısım bir anlam ifade etmiyorsa, nasıl çalıştığını görmek için birkaç basit örneği genişletmeyi deneyin.
Birleştirme sıralaması hoş bir yinelemeli tanıma sahiptir:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Ne arayacağınızı biliyorsanız, yinelemeli tanımlar her yerde. Tüm bu tanımların nasıl çok basit temel durumlara sahip olduğuna dikkat edin, örneğin gcd (m, 0) = m. Özyinelemeli vakalar, kolay cevaplara inmek için problemi ortadan kaldırır.
Bu anlayışla, Wikipedia'nın özyineleme hakkındaki makalesindeki diğer algoritmaları artık takdir edebilirsiniz !