İ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