문제

내 전력 기능에 어떤 문제가 있습니까?

pow(_,0,1).   
pow(X,Y,Z) :-
    pow(X,Y-1,X*Z).

?- pow(2,3,Z).
ERROR: Out of global stack
도움이 되었습니까?

해결책

Y는 감소하지 않으며, 같은 함수를 사용할 수 없습니다. 또한 곱셈의 결과로 Z를 통일해야합니다.

pow(_,0,1).

pow(X,Y,Z) :- Y1 is Y - 1,
              pow(X,Y1,Z1), Z is Z1*X.

훨씬 더 빠른 내장 전력 기능도 있습니다.

pow2(X,Y,Z) :- Z is X**Y.

또한 POW는 마지막 호출이 아니며 하나의 스택 프레임 만 사용하도록 최적화 할 수 없습니다. 당신은 그것을 재구성해야합니다.

pow3(X,Y,Z) :- powend(X,Y,1,Z),!.

powend(_,0,A,Z) :- Z is A.
powend(X,Y,A,Z) :- Y1 is Y - 1, A1 is A*X, powend(X,Y1,A1,Z).

다른 팁

Predicates
fac(Integer,Integer,Integer).
Clauses
fac(X,N,X):- N=1,!.
fac(X,N,M):- N1=N-1,fac(X,N1,M1), M= X*M1.
Goal
fac(5,3,X).
DOMAINS
num=INTEGER

PREDICATES
nondeterm power(num,num,num)

CLAUSES
power(X,0,1).
power(X,P,F):-X>0,P1=P-1,power(X,P1,F1),F=X*F1.

GOAL
power(2,5,X).
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top