Elixir-recursion
エリクサー-再帰
再帰は、問題の解決策が同じ問題の小さなインスタンスの解決策に依存する方法です。 ほとんどのコンピュータープログラミング言語は、関数がプログラムテキスト内で自身を呼び出すことを許可することにより、再帰をサポートしています。
理想的には、再帰関数には終了条件があります。 この終了条件は、ベースケースとも呼ばれ、関数の再入力と関数呼び出しのスタックへの追加を停止します。 これは、再帰関数呼び出しが停止する場所です。 再帰関数をさらに理解するために、次の例を考えてみましょう。
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))
上記のプログラムを実行すると、次の結果が生成されます-
120
したがって、上記の関数 Math.fact では、数値の階乗を計算しています。 関数自体を呼び出していることに注意してください。 これがどのように機能するかを理解しましょう。
1と、階乗を計算する数値を提供しました。 この関数は、数値が1かどうかを確認し、1 (終了条件)の場合にresを返します。 そうでない場合は、変数new_resを作成し、以前のres * current numの値を割り当てます。 関数呼び出し_fact(new_res、num-1)_によって返された値を返します。 これは、numが1になるまで繰り返されます。 それが起こると、結果が得られます。
リストの各要素を1つずつ印刷する別の例を考えてみましょう。 これを行うには、リストの hd および tl 関数と関数のパターンマッチングを使用します-
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)
最初の印刷関数は、空のリスト(終了条件)があるときに呼び出されます。 そうでない場合は、2番目の印刷関数が呼び出され、リストが2に分割され、リストの最初の要素が先頭に、リストの残りの要素が末尾に割り当てられます。 次に、ヘッドが印刷され、リストの残りの部分、つまり末尾で再度print関数を呼び出します。 上記のプログラムが実行されると、次の結果が生成されます-
Hey
100
452
true
People