Prolog - 做一个递归除数

时间:2013-02-21 17:27:35

标签: recursion prolog increment

好的,所以我是Prolog的初学者,所以如果我不能很清楚地解决我的问题,我很抱歉,但这是我在努力的地方:

divide_by(X, D, I, R) :- (D > X), I is 0, R is X.

divide_by(X, D, I, R) :-
X >= D,
X_1 is X - D,
I_1 is I + 1,
divide_by(X_1, D, I_1, R),
R is X_1.

我正在尝试编写一个程序,它接受两个参数(X和D)并返回Iterations(I)和Remainder(R),以便在用户输入时显示X / D的结果: divide_by(8,3,I,R)。例如。

当跟踪代码时,我知道我是不正确的,因为第一个增量使它等于0,因此计数错误。但我不知道如果声明我是0而没有它每次通过循环复位时重置。 (我不想在查询中声明我为0)

我也意识到当它完成递归时(当X

有人愿意告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您需要引入累加器并使用辅助谓词,如下所示:

divide(_,0,_,_) :- !, fail . % X/0 is undefined and so can't be solved.
divide(0,_,0,0) :- !.        % 0/X is always 0.
divide(X,Y,Q,R) :-           % the ordinary case, simply invoke the
  divrem(X,Y,0,Q,R)          % helper with the accumulator seeded with 0
  .

divrem(X,Y,Q,Q,X) :-   % if X < Y, we're done.
  X < Y .              %
divrem(X,Y,T,Q,R) :-   % otherwise...
  X >= Y ,             % as long as X >= Y,
  X1 is X - Y ,        % compute the next X
  T1 is T + 1 ,        % increment the accumulator
  divrem(X1,Y,T1,Q,R)  % recurse down
  .                    % Easy!