首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >欧几里得递归算法

欧几里得递归算法
EN

Stack Overflow用户
提问于 2012-04-08 16:01:50
回答 1查看 1.4K关注 0票数 0

好吧,我知道这是个很愚蠢的问题,但是我不明白。有一个任务,我应该找到Euclid (gcd)的递归算法。我已经为一个案例做过了,这里:

代码语言:javascript
复制
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).

我需要做另一个例子,当Xi调用计数Xi+1的函数时,递归从х0开始,应该是这样的:

代码语言:javascript
复制
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).

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

EN

回答 1

Stack Overflow用户

发布于 2015-08-18 17:24:56

下面的代码适用于我。请注意rem的用法,但我猜您也可以使用mod:

代码语言:javascript
复制
% 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运行的示例:

代码语言:javascript
复制
?- 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.

如果你想要一个特殊的结果符号,你需要额外的代码。

再见

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10061343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档