Рекурсия смущает меня - PullRequest
0 голосов
/ 22 мая 2018

Я понял теоретическую часть рекурсии.Я видел упражнения, но я запутался.Я пытался решить некоторые, некоторые я понимаю, а некоторые нет.Это упражнение сбивает меня с толку.Я не могу понять почему, поэтому я использую комментарии, чтобы показать вам мои слабые стороны.У меня должна быть сила (X, N, P), поэтому P = X ^ N.Некоторые примеры:

?- power(3,5,X).
X = 243
?- power(4,3,X).
X = 64
?- power(2,4,X).
X = 16 

Решение этого упражнения: (См. Также комментарии)

power(X,0,1).      % I know how works recursion,but those numbers 0 or 1 why? 
power(X,1,X).      % X,1,X i can't get it.
power(X,N,P) :-    % X,N,P if only 
   N1 is N-1,      % N1=N-1 ..ok i understand
   power(X,N1,P1), % P1 is used to reach the the P
   P is P1*X.      % P = P1*X 

Что я знаю рекурсия, я использую другой мой пример

related(X, Y) :-              
   parent(X, Z),                 
   related(Z, Y).

Сравните мой пример с упражнением.Я мог бы сказать, что моя первая строка, что я думаю.Пожалуйста, помогите мне с этим много путаницы.

related(X, Y) :- похож на power(X,N,P) :-.Второе предложение моего примера parent(X, Z), похоже на N1 is N-1,, а третье предложение related(Z, Y). похоже на power(X,N1,P1), и P is P1*X..

1 Ответ

0 голосов
/ 22 мая 2018

Давайте рассмотрим определение предиката шаг за шагом.Сначала у вас есть факт ...

power(X,0,1).

..., который гласит: 0-я степень любого X равна 1.Тогда есть факт ...

power(X,1,X).

..., который гласит: 1-я сила любой X равна X сам по себе. Наконец, у вас есть рекурсивное правило, которое гласит:

power(X,N,P) :-    % P is the Nth power of X     if 
   N1 is N-1,      % N1 = N-1                    and
   power(X,N1,P1), % P1 is the N1th power of X   and
   P is P1*X.      % P = P1*X

Возможно, ваша путаница связана с двумя базовыми случаями, которые выражены двумя фактами (один из них на самом деле является излишним).Давайте рассмотрим следующие запросы:

?- power(5,0,X).
X = 1 ;
ERROR: Out of local stack

Ответ 1 - это, конечно, то, что мы ожидаем, но затем предикат зацикливается, пока он не исчерпает стек.Это, конечно, не желательно.И этот запрос ...

?- power(5,1,X).
X = 5 ;
X = 5 ;
ERROR: Out of local stack

... дважды дает правильный ответ, прежде чем закончится стек.Причина избыточного ответа состоит в том, что рекурсивное правило может уменьшить любое заданное значение N до нуля и до единицы, что дает один и тот же ответ дважды.Если вы посмотрите на структуру вашего рекурсивного правила, очевидно, что первого базового случая достаточно, поэтому давайте удалим второй.Причина выхода из стека заключается в том, что после того, как N станет нулевым, рекурсивное правило будет искать другие решения (для N=-1, N=-2, N=-3, ...), которые не существуют.Чтобы избежать этого, вы можете добавить цель, которая препятствует дальнейшему поиску рекурсивного правила, если N равно или меньше нуля.Это оставляет вам следующее определение:

power(X,0,1).      % the 0th power of any X is 1
power(X,N,P) :-    % P is the Nth power of X     if
   N > 0,          % N > 0                       and
   N1 is N-1,      % N1 = N-1                    and
   power(X,N1,P1), % P1 is the N1th power of X   and
   P is P1*X.      % P = P1*X

Теперь предикат работает, как и ожидалось:

?- power(5,0,X).
X = 1 ;
false.

?- power(5,1,X).
X = 5 ;
false.

?- power(5,3,X).
X = 125 ;
false.

Надеюсь, это ослабит некоторые ваши заблуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...