2013-02-21 49 views
1

好了,所以我在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)并返回迭代(I)和剩余(R),以便它可以在用户输入时显示X/D的结果: divide_by (8,3,I,R)。例如。

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

我也意识到,当它完成递归时(当X < D)时,我将因为基本情况而被设置为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! 
+0

这使得这么多的意义,谢谢!这么简单,但我无法到达那里。 虽然,你会希望> =在第二种情况下,只是<在第一,否则divide_by(6,6,我,R)会给出结果I = 0,R = 6。 – user2096383 2013-02-21 18:20:05

+0

@ user2096383:修复它为你。 – 2013-02-22 01:15:50