2012-04-08 6 views
0

좋아, 정말 바보 같은 질문인데, 이해가 안되네. Euclid (gcd)의 재귀 알고리즘을 찾아야하는 작업이 있습니다. 여기, 하나의 경우에 그것을 한 적이 :유클리드 재귀 알고리즘

nondeterm nod (integer,integer,integer) 
CLAUSES 
nod (X,0,X):- !. 
nod (0,X,X):- !. 
nod (X,0,X):-X>0. 
nod (X,Y,G):-Y>0, Z = X mod Y, nod (Y,Z,G). 

내가 사이가 다음 기능 계수 사이 + 1 호출 할 때 재귀 х0에서 beginnig 또 다른 경우를 할 필요가있다. 그것은 일종의 그것을해야한다 :

PREDICATES 
nondeterm nod (integer,integer,integer) 
nondeterm nod1 (integer,integer,integer,integer,integer)  
CLAUSES 
nod(X,Y,Z):- nod1(X,Y,Z,0,0). 
nod1 (X,Y,Z,X,Y):- Otvet = Z, write("Otvet=", Otvet, "\n"), !. 
nod1 (X,Y,X,Y):- nod1 (X,Y,X,Y). 
nod1 (X,Y,Z,X1,Y1):- 
       X1>Y1, X>0, Y>0, 
       Y2 = X1 mod Y1, 
       X2 = Y1, 
       nod1(X,Y,Z,X2,Y2). 

을하지만 그것은 작동하지 않습니다. 제발 도와 줘.

+0

왜 nondeterm입니까? 결정적인 것 같습니다 – CapelliC

+0

죄송합니다. 귀하의 질문에 이해가되지 않습니다. 'Xi + 1'은 어디에 있습니까? 첫 번째 코드 상자에서'nod (X, 0, X) : -! .'는'nod (X, 0, X) : -X> 0.'와 충돌합니다. 두 번째는 절대로 호출되지 않습니다. 이 규칙은'nod1 (X, Y, X, Y) : - nod1 (X, Y, X, Y) .'과 같이 쓸모 없으며 호출되면 루프됩니다. – CapelliC

+0

글쎄 ... 나는 사촌 내가 고개를 끄덕의 결과를 찾을 필요가 있다고 생각. 내가 잘못? – eeeee

답변

0

다음 코드는 저에게 적합합니다. 렘의 사용을주의,하지만 난 당신이 또한 모드를 사용할 수 있습니다 생각하십시오 : 여기

% sys_gcd(+Integer, +Integer, -Integer) 
sys_gcd(X, 0, X) :- !. 
sys_gcd(X, Y, Z) :- 
    H is X rem Y, 
    sys_gcd(Y, H, Z). 

몇 가지 예이다는 SWI - 프롤로그으로 실행 :

?- sys_gcd(20,30,X). 
X = 10. 
?- sys_gcd(-20,30,X). 
X = 10. 
?- sys_gcd(20,-30,X). 
X = -10. 
?- sys_gcd(-20,-30,X). 
X = -10. 

당신은 결과의 특정 기호를 원하는 경우 , 당신은 주위에 추가 코드가 필요합니다.

bye

관련 문제