Elixir-再帰

再帰は、問題の解決策が同じ問題のより小さなインスタンスの解決策に依存する方法です。ほとんどのコンピュータープログラミング言語は、関数がプログラムテキスト内でそれ自体を呼び出すことを許可することにより、再帰をサポートします。

理想的には、再帰関数には終了条件があります。基本ケースとも呼ばれるこの終了条件は、関数の再入力とスタックへの関数呼び出しの追加を停止します。ここで再帰関数呼び出しが停止します。再帰関数をさらに理解するために、次の例を考えてみましょう。

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を返します。(Ending condition)。そうでない場合は、変数new_resを作成し、前のres * currentnumの値を割り当てます。これは、関数呼び出し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)

空のリストがある場合、最初の印刷関数が呼び出されます(ending condition)。そうでない場合は、2番目の印刷関数が呼び出され、リストが2つに分割され、リストの最初の要素が先頭に割り当てられ、リストの残りの部分が末尾に割り当てられます。次に、headが印刷され、リストの残りの部分、つまりtailを使用してprint関数を再度呼び出します。上記のプログラムを実行すると、次の結果が生成されます-

Hey
100
452
true
People