Хвост рекурсивного возведения в степень в прологе

Я пытаюсь написать код, который получает 3 аргумента, когда X - коэффициент, Y - показатель степени, а R должен вернуть ответ.

Мой код до сих пор -

exp(X,0,R):- R is X*X.
exp(X,Y,R):- Y1 is Y-1, exp(X,Y1,R).

Я знаю, что это не работает.

Но я не могу понять это.

1 ответ

Проверь это:

3 ?- X is 5 // 2, Y is 5 rem 2.
X = 2,
Y = 1.
4 ?- 0 is 5 rem 2.
false.

Так,

R being X^Y is the same as
   R being .....
         when Y is 0, OR
   R being .....
         when Y is 1, OR
   R being R2*R2 and R2 being X^Y2
         when Y is even, Y2 is Y // 2, OR
   R being ..... and R2 being X^Y2
         when Y is odd, Y2 is (Y-1) // 2.

или, в прологе,

is_power(R,X,Y):- Y is 0, R is ... .
is_power(R,X,Y):- Y is 1, R is ... .
is_power(R,X,Y):- Y > 1, ... , is_power(R2,X,Y2), R is ... 
...

Чтобы написать код, который вы запрашиваете, вы просто уменьшаете его на 1, а не делите пополам (соответственно, изменяя остальную часть кода).

Другие вопросы по тегам