Eliksir - rekurencja
Rekursja to metoda, w której rozwiązanie problemu zależy od rozwiązań mniejszych wystąpień tego samego problemu. Większość języków programowania komputerów obsługuje rekursję, umożliwiając funkcji wywoływanie siebie w tekście programu.
W idealnym przypadku funkcje rekurencyjne mają warunek końcowy. Ten warunek końcowy, znany również jako przypadek podstawowy, przerywa ponowne wprowadzanie funkcji i dodawanie wywołań funkcji do stosu. Tutaj kończy się rekurencyjne wywołanie funkcji. Rozważmy następujący przykład, aby lepiej zrozumieć funkcję rekurencyjną.
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))
Po uruchomieniu powyższego programu generuje następujący wynik -
120
Więc w powyższej funkcji Math.fact, obliczamy silnię liczby. Zauważ, że wywołujemy funkcję w sobie. Zrozummy teraz, jak to działa.
Podaliśmy mu 1 i liczbę, której silnię chcemy obliczyć. Funkcja sprawdza, czy liczba wynosi 1, czy nie, i zwraca res, jeśli wynosi 1(Ending condition). Jeśli nie, to tworzy zmienną new_res i przypisuje jej wartość poprzedniego res * current num. Zwraca wartość zwróconą przez fakt wywołania funkcji (new_res, num-1) . To się powtarza, aż liczba wynosi 1. Kiedy to się stanie, otrzymamy wynik.
Rozważmy inny przykład, drukując każdy element listy jeden po drugim. Aby to zrobić, użyjemyhd i tl funkcje list i dopasowywania wzorców w funkcjach -
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)
Pierwsza funkcja print jest wywoływana, gdy mamy pustą listę(ending condition). Jeśli nie, zostanie wywołana druga funkcja drukowania, która podzieli listę na 2 i przypisze pierwszy element listy do nagłówka, a pozostałą część listy do końca. Następnie drukowana jest głowa i ponownie wywołujemy funkcję print z resztą listy, tj. Tail. Uruchomienie powyższego programu daje następujący wynik -
Hey
100
452
true
People