Elixir - Đệ quy

Đệ quy là một phương pháp trong đó giải pháp cho một vấn đề phụ thuộc vào các giải pháp cho các trường hợp nhỏ hơn của cùng một vấn đề. Hầu hết các ngôn ngữ lập trình máy tính đều hỗ trợ đệ quy bằng cách cho phép một hàm gọi chính nó trong văn bản chương trình.

Lý tưởng nhất là hàm đệ quy có điều kiện kết thúc. Điều kiện kết thúc này, còn được gọi là trường hợp cơ sở ngừng nhập lại hàm và thêm các lệnh gọi hàm vào ngăn xếp. Đây là nơi mà lệnh gọi hàm đệ quy dừng lại. Chúng ta hãy xem xét ví dụ sau để hiểu sâu hơn về hàm đệ quy.

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))

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

120

Vì vậy, trong hàm trên, Math.fact, chúng tôi đang tính giai thừa của một số. Lưu ý rằng chúng ta đang gọi hàm trong chính nó. Bây giờ chúng ta hãy hiểu cách này hoạt động.

Chúng tôi đã cung cấp cho nó 1 và số có giai thừa mà chúng tôi muốn tính. Hàm kiểm tra xem số có phải là 1 hay không và trả về res nếu là 1(Ending condition). Nếu không, nó sẽ tạo một biến new_res và gán cho nó giá trị của res * num hiện tại trước đó. Nó trả về giá trị được trả về bởi thực tế cuộc gọi hàm của chúng ta (new_res, num-1) . Điều này lặp lại cho đến khi chúng ta nhận được num là 1. Khi điều đó xảy ra, chúng ta nhận được kết quả.

Chúng ta hãy xem xét một ví dụ khác, in từng phần tử của danh sách một. Để làm điều này, chúng tôi sẽ sử dụnghdtl chức năng của danh sách và so khớp mẫu trong các chức năng -

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)

Hàm in đầu tiên được gọi khi chúng ta có một danh sách trống(ending condition). Nếu không, thì hàm in thứ hai sẽ được gọi sẽ chia danh sách làm 2 và gán phần tử đầu tiên của danh sách là đầu và phần tử còn lại của danh sách là đuôi. Sau đó phần đầu được in và chúng ta gọi lại hàm in với phần còn lại của danh sách, tức là phần đuôi. Khi chương trình trên được chạy, nó tạo ra kết quả sau:

Hey
100
452
true
People