2017-10-29 22 views
1

언어를 테스트하기 위해 얼랭 (Erlang) 셸을 사용하고 있습니다. 두 가지 방법으로 합계 함수를 작성했습니다. 하나는 더 일반적인 재귀 적 합계이고 다른 하나는 꼬리 재귀를 사용하는 코드입니다. 두 번째 것은 선형이며, 첫 번째는 입력 크기로 커집니다.재귀의 각 단계를 인쇄합니다.

재귀의 각 단계를 어떻게 볼 수 있습니까? 각 단계에서 현재 값을 출력하여 상황을 더 잘 이해할 수 있기를 바랍니다.

일반 재귀 :

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

꼬리 재귀 :

tail_sum(List) -> tail_sum(List, 0). 
tail_sum([], Sum) -> Sum; 
tail_sum([H|T], Sum) -> tail_sum(T, H+Sum). 

답변

5

얼랑의 dbg 모듈이 유용한 기능을 제공 : 추적 여기

내 두 가지 기능이 있습니다.

설치 프로그램 : 당신이 모듈에있는 함수를 호출 할 때마다 지금

1> c(a). % load a.erl 
{ok,a} 
2> dbg:tracer(). % start the default trace message receiver 
{ok,<0.71.0>} 
3> dbg:p(all, c). % setup call tracing on all processes 
{ok,[{matched,[email protected],34}]} 
4> dbg:tpl(a, '_', '_', []). % trace all functions in a 
{ok,[{matched,[email protected],5}]} 

, 이름과 인수가 쉘에 인쇄됩니다 다음은 코드를 모듈 a에 가정이 함수를 추적 할 것입니다 방법 .

5> a:sum(lists:seq(1, 10)). 
(<0.64.0>) call a:sum([1,2,3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([2,3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([6,7,8,9,10]) 
(<0.64.0>) call a:sum([7,8,9,10]) 
(<0.64.0>) call a:sum("\b\t\n") 
(<0.64.0>) call a:sum("\t\n") 
(<0.64.0>) call a:sum("\n") 
(<0.64.0>) call a:sum([]) 
55 
6> a:tail_sum(lists:seq(1, 10)). 
(<0.64.0>) call a:tail_sum([1,2,3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:tail_sum([1,2,3,4,5,6,7,8,9,10],0) 
(<0.64.0>) call a:tail_sum([2,3,4,5,6,7,8,9,10],1) 
(<0.64.0>) call a:tail_sum([3,4,5,6,7,8,9,10],3) 
(<0.64.0>) call a:tail_sum([4,5,6,7,8,9,10],6) 
(<0.64.0>) call a:tail_sum([5,6,7,8,9,10],10) 
(<0.64.0>) call a:tail_sum([6,7,8,9,10],15) 
(<0.64.0>) call a:tail_sum([7,8,9,10],21) 
(<0.64.0>) call a:tail_sum("\b\t\n",28) 
(<0.64.0>) call a:tail_sum("\t\n",36) 
(<0.64.0>) call a:tail_sum("\n",45) 
(<0.64.0>) call a:tail_sum([],55) 
55 

또한 return_trace()을 반환 일치 스펙을 사용하여 반환 된 값을 기록하기 위해 추적을 요청할 수 있습니다. 완벽하게 작동

7> dbg:tpl(a, '_', '_', [{'_',[],[{return_trace}]}]). 
(<0.64.0>) call a:module_info() 
{ok,[{matched,[email protected],5},{saved,1}]} 
8> a:sum(lists:seq(1, 10)). 
(<0.64.0>) call a:sum([1,2,3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([2,3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([4,5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([5,6,7,8,9,10]) 
(<0.64.0>) call a:sum([6,7,8,9,10]) 
(<0.64.0>) call a:sum([7,8,9,10]) 
(<0.64.0>) call a:sum("\b\t\n") 
(<0.64.0>) call a:sum("\t\n") 
(<0.64.0>) call a:sum("\n") 
(<0.64.0>) call a:sum([]) 
(<0.64.0>) returned from a:sum/1 -> 0 
(<0.64.0>) returned from a:sum/1 -> 10 
(<0.64.0>) returned from a:sum/1 -> 19 
(<0.64.0>) returned from a:sum/1 -> 27 
(<0.64.0>) returned from a:sum/1 -> 34 
(<0.64.0>) returned from a:sum/1 -> 40 
(<0.64.0>) returned from a:sum/1 -> 45 
(<0.64.0>) returned from a:sum/1 -> 49 
(<0.64.0>) returned from a:sum/1 -> 52 
(<0.64.0>) returned from a:sum/1 -> 54 
(<0.64.0>) returned from a:sum/1 -> 55 
55 
9> a:tail_sum(lists:seq(1, 10)). 
(<0.64.0>) call a:tail_sum([1,2,3,4,5,6,7,8,9,10]) 
(<0.64.0>) call a:tail_sum([1,2,3,4,5,6,7,8,9,10],0) 
(<0.64.0>) call a:tail_sum([2,3,4,5,6,7,8,9,10],1) 
(<0.64.0>) call a:tail_sum([3,4,5,6,7,8,9,10],3) 
(<0.64.0>) call a:tail_sum([4,5,6,7,8,9,10],6) 
(<0.64.0>) call a:tail_sum([5,6,7,8,9,10],10) 
(<0.64.0>) call a:tail_sum([6,7,8,9,10],15) 
(<0.64.0>) call a:tail_sum([7,8,9,10],21) 
(<0.64.0>) call a:tail_sum("\b\t\n",28) 
(<0.64.0>) call a:tail_sum("\t\n",36) 
(<0.64.0>) call a:tail_sum("\n",45) 
(<0.64.0>) call a:tail_sum([],55) 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/2 -> 55 
(<0.64.0>) returned from a:tail_sum/1 -> 55 
55 
+0

: sum 점진적으로 tail_sum 달리 값을 빌드하는 방법이 명확하게 보여줍니다! 감사합니다. –

+4

방금 ​​return_trace를 포함하도록 답을 편집했습니다. 이것은 당신에게 더 유용 할 것입니다. 추적은 Erlang VM의 가장 좋아하는 기능 중 하나입니다! – Dogbert