İksir - Özyineleme
Özyineleme, bir problemin çözümünün aynı problemin daha küçük örneklerinin çözümlerine bağlı olduğu bir yöntemdir. Çoğu bilgisayar programlama dili, bir işlevin kendisini program metni içinde çağırmasına izin vererek özyinelemeyi destekler.
İdeal olarak özyinelemeli fonksiyonların bir bitiş koşulu vardır. Temel durum olarak da bilinen bu sonlandırma koşulu, işleve yeniden girmeyi ve yığına işlev çağrıları eklemeyi durdurur. Özyinelemeli işlev çağrısının durduğu yer burasıdır. Özyinelemeli işlevi daha iyi anlamak için aşağıdaki örneği ele alalım.
defmodule Math do
def fact(res, num) do
if num === 1 do
res
else
new_res = res * num
fact(new_res, num-1)
end
end
end
IO.puts(Math.fact(1,5))
Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu üretir -
120
Yani yukarıdaki işlevde, Math.fact, bir sayının faktöriyelini hesaplıyoruz. İşlevi kendi içinde çağırdığımıza dikkat edin. Şimdi bunun nasıl çalıştığını anlayalım.
Buna 1 ve faktöriyelini hesaplamak istediğimiz sayıyı verdik. İşlev, sayının 1 olup olmadığını kontrol eder ve 1 ise res döndürür.(Ending condition). Değilse, bir new_res değişkeni yaratır ve ona önceki res * mevcut num değerini atar. İşlev çağrımız fact (new_res, num-1) tarafından döndürülen değeri döndürür . Bu, 1 olarak sayı alana kadar tekrar eder. Bu gerçekleştiğinde, sonucu alırız.
Listenin her bir öğesini tek tek yazdırarak başka bir örneği ele alalım. Bunu yapmak için kullanacağızhd ve tl listelerin işlevleri ve işlevlerde örüntü eşleştirme -
a = ["Hey", 100, 452, :true, "People"]
defmodule ListPrint do
def print([]) do
end
def print([head | tail]) do
IO.puts(head)
print(tail)
end
end
ListPrint.print(a)
İlk yazdırma işlevi boş bir listemiz olduğunda çağrılır(ending condition). Değilse, listeyi 2'ye bölen ve listenin ilk öğesini başa, kalanını kuyruğa atayan ikinci yazdırma işlevi çağrılacaktır. Daha sonra kafa yazdırılır ve listenin geri kalanıyla, yani kuyrukla birlikte tekrar yazdırma işlevini çağırırız. Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -
Hey
100
452
true
People