Другая реализация x у power n в Прологе
Привет, кто-нибудь знает другую реализацию для вычисления X при мощности N в Прологе, кроме этой:
predicates
power(real, integer, real)
clauses
power(_,0,1).
power(X,N,R):-
N<0,
N1 = -N,
X1 = 1/X,
power(X1,N1,R).
power(X,N,R):-
N1=N-1,
power(X,N1,R1),
R=R1*X.
1 ответ
В любом случае, я бы отнесся к отрицательному показателю с помощью предиката, как уже дано в проблемном посте, а именно:
power(Base, N, P) :-
N < 0,
N1 is -N,
power(Base, N1, P1),
P is 1/P1.
Таким образом, следующие предполагают неотрицательные показатели.
Этот алгоритм умножает основание N
раз:
power1(Base, N, P) :-
N > 0,
N1 is N - 1,
power1(Base, N1, P1),
P is P1 * Base.
power1(Base, N, P) :-
N < 0,
N1 is N + 1,
power1(Base, N1, P1),
P is P1 / Base.
power1( _Base, 0, 1 ).
Этот алгоритм умножает основание N
время использования хвостовой рекурсии:
power1t(Base, N, P) :-
N >= 0,
power1t(Base, N, 1, P).
power1t(Base, N, A, P) :-
N > 0,
A1 is A * Base,
N1 is N - 1,
power1t(Base, N1, A1, P).
power1t(_, 0, P, P).
В этой версии используется метод "power of 2", минимизирующий умножения:
power2(_, 0, 1).
power2(Base, N, P) :-
N > 0,
N1 is N div 2,
power2(Base, N1, P1),
( 0 is N /\ 1
-> P is P1 * P1
; P is P1 * P1 * Base
).
Эта версия использует метод "степени 2", минимизируя умножения, но является хвостовой рекурсией. Это немного отличается от того, что связал Борис:
power2t(Base, N, P) :-
N >= 0,
power2t(Base, N, Base, 1, P).
power2t(Base, N, B, A, P) :-
N > 0,
( 1 is N /\ 1
-> A1 is B * A
; A1 = A
),
N1 is N div 2,
B1 is B * B,
power2t(Base, N1, B1, A1, P).
power2t(_, 0, _, P, P).