2013-09-25 1 views
0

안녕하세요 저는 프롤로그 반복 및 반복에 대해 약간 혼란 스럽습니다. 내가 ...프롤로그에서리스트의 합계를위한 반복 프로그램

add_r([],0). 
add_r([H|T],X) :- add_r(T,X1),X is H + X1. 

add_i(List,Sum) :- add_i(List,0,Sum). 
add_i([H|T],I,Sum) :- I1 is I + H , add_i(T,I1,Sum). 
add_i([], I1, I1). 

를 재귀와 반복에서 목록의 합에 대한 코드를 각각 제공하고 각이 올바른지 여부를 알고 싶어하고 여기에 add_r는 반복 (나)에 따라되는 재귀 프로그램 add_i입니다 ... 나는 틀릴 수도 있습니다. 여기에서는 "I"가 반복 제어에 사용됩니다.
내가 잘못하면 나를 바로 잡아주세요.

답변

2

Abelson & Sussman (구조 및 해석의 컴퓨터 프로그램)이라는 용어를 사용하는 것이 맞습니다.

이 경우 "반복"은 프로세스의 상태가 몇 개의 변수로 완전히 설명되고 "재귀 적"은 각 호출과 함께 증가하는 변수의 수를 의미합니다. 또한 재귀 적 프로세스에는 성장과 감소의 2 단계가 있으며 성장시 "선택 점"등이 남습니다 (모든 차이점은 SICP에 설명되어 있습니다).

프롤로그에서 두 번째 예제와 관련하여 "꼬리 재귀"라는 용어가 "반복적"이라는 용어보다 자주 사용됩니다.

2

엄밀히 말하면, Prolog 이 없기 때문에 변수가 'write once'(일종의 ...)이기 때문에 반복이 가능합니다.

두 술어 모두 재귀 적이며 올바른 것으로 보입니다.

그들 사이의 차이점은 add_i 점프와 재귀 호출 를 대체 (마지막 호출 최적화를 참조하거나 Tail Call) 꼬리 재귀 (재귀 호출로 마지막 표시), 따라서 컴파일러를 최적화 할 수 있습니다입니다이므로 add_r에 필요한 선형 스택 공간을 피할 수 있습니다.