欧几里德递归算法

时间:2012-04-08 08:01:50

标签: prolog greatest-common-divisor visual-prolog

好的,我知道这真是一个愚蠢的问题,但我无法理解。 有一个任务,我应该找到一个递归算法 Euclid(gcd)。我已经完成了一个案例,在这里:

nondeterm nod (integer,integer,integer)
CLAUSES
nod (X,0,X):- !.
nod (0,X,X):- !.
nod (X,0,X):-X>0.
nod (X,Y,G):-Y>0, Z = X mod Y, nod (Y,Z,G).

我需要做另一种情况,其中递归从х0开始,当Xi然后调用函数计数Xi + 1。 应该是这样的:

PREDICATES
nondeterm nod (integer,integer,integer)
nondeterm nod1 (integer,integer,integer,integer,integer)     
CLAUSES
nod(X,Y,Z):- nod1(X,Y,Z,0,0).   
nod1 (X,Y,Z,X,Y):- Otvet = Z, write("Otvet=", Otvet, "\n"), !.
nod1 (X,Y,X,Y):- nod1 (X,Y,X,Y).
nod1 (X,Y,Z,X1,Y1):-
              X1>Y1, X>0, Y>0, 
              Y2 = X1 mod Y1,
              X2 = Y1,
              nod1(X,Y,Z,X2,Y2).

但它不起作用。请帮助我。

1 个答案:

答案 0 :(得分:0)

以下代码适用于我。请注意使用 rem,但我想你也可以使用mod:

% sys_gcd(+Integer, +Integer, -Integer)
sys_gcd(X, 0, X) :- !.
sys_gcd(X, Y, Z) :-
   H is X rem Y,
   sys_gcd(Y, H, Z).

以下是SWI-Prolog的一些示例运行:

?- sys_gcd(20,30,X).
X = 10.
?- sys_gcd(-20,30,X).
X = 10.
?- sys_gcd(20,-30,X).
X = -10.
?- sys_gcd(-20,-30,X).
X = -10.

如果您想要结果的特定标志,那么 需要额外的代码。

再见