재귀 함수

7277 단어 erlangtutorial
이것은 Erlang의 재귀 함수를 설명하려고 합니다. 어떻게 작성하고 어떻게 작동하는지.

다른 언어에는 for, while 및 기타 루프가 있기 때문에 Erlang은 재귀 함수를 자주 사용합니다. Erlang에서는 재귀 함수로 이를 수행합니다.

예시:

-module(recursive).

-export([sum/1]).

sum([]) ->
    0;
sum([Head | Tail]) ->
   Head + sum(Tail).


여기서 우리는 정수 목록을 가져와 요약하는 sum 함수를 수행합니다.

15> recursive:sum([1,2,3]).
6


함수를 호출하면 어떻게 될까요?

Erlang의 일은 코드의 맨 위에서 맨 아래로 이동하는 방식으로 작동합니다.

재귀:합([1,2,3]). 인수 [1,2,3]으로 이 함수를 호출하면 이런 일이 발생합니다.

sum([]) ->
   0;
sum([1 | [2,3]]) ->
   1 + sum([2,3]).


먼저 첫 번째 함수 절을 치고 목록에 세 개의 요소가 포함되어 있기 때문에 다음 함수 절로 넘어갑니다. 여기서 목록의 머리는 1이 되고 꼬리는 두 개의 요소가 있는 목록이 됩니다[2,3].

함수 sum을 다시 호출하지만 이제 꼬리가 있는 재귀 호출은 우리에게 줄 것입니다.

sum([]) ->
   0;
sum([2 | [3]]) ->
   2 + sum([3]).


우리는 또한 목록의 마지막 요소로 이를 수행합니다.

sum([]) ->
   0;
sum([3 | []]) ->
   3 + sum([]).


여기서 마지막 호출은 기본 케이스에 도달하고 0을 반환합니다.

이렇게 하면 3 + 2 + 1 + 0(기본 사례) = 6이 계산됩니다.

꼬리 재귀를 사용하여 이 작업을 수행할 수도 있으므로 재귀 결과를 다음으로 전달할 수 있습니다.

sum([], Sum) ->
    Sum;
sum([Head | Tail], Sum) ->
    sum(Tail, Sum + Head).


이것은 꼬리 재귀를 사용하는 우리의 기능입니다. 여기서 일어날 일은 우리가 위에서 했던 것과 매우 유사합니다. 지금과 다른 점은 재귀 단계에서 덧셈을 수행하고 그 결과를 다음 재귀로 보내는 것입니다. 기본 케이스에 도달하면 결과를 반환합니다.

16> c(recursive).          
{ok,recursive}
17> recursive:sum([1,2,3], 0).
6


이제 aritry 2가 있는 sum이라는 함수를 만들었습니다. 정수와 시작 값이 포함된 목록을 사용합니다.

sum([], Sum) ->
   Sum;
sum([1 | [2,3]], 0) ->
   sum([2,3], 0 + 1).



sum([], Sum) ->
   Sum;
sum([2 | [3]], 1) ->
   sum([3], 1 + 2).



sum([], Sum) ->
   Sum;
sum([3 | []], 3) ->
   sum([], 3 + 3).



sum([], 6) ->
   6;
sum([Head | Tail], Sum) ->
   sum(Tail, Sum + Head).


기본 사례에 도달하고 목록이 비어 있으면 이 경우 6인 변수 Sum을 반환합니다.

좋은 웹페이지 즐겨찾기