2017-01-19 10 views
-1

こんにちは私はPrologで数字のリストのGCDを見つけようとしていますが、それをすることはできません。 助けてくれますか?Prolog数字のリストのGCDを見つける

私はまだほとんど閉じていないので、今まで私の仕事を分かち合っていません。 PP:これを解決しようとする過程で、私は解決できない別の問題に遭遇しました。もしあなたがこの手助けもできれば、私は感謝します。それは2つの数のすべての共通の除数を見つけることです。

ありがとうございます!

+0

興味深い:[RosettaCode - GCD - Prolog](http://rosettacode.org/wiki/Greatest_common_divisor#Prolog) –

+0

このサイトからProlog GCDを検索することができます。私はあなたが何かを見つけるだろうと確信しています。 – lurker

+2

GCDの計算方法に関する一般的な算術戦略を決めましたか? Prologとは独立して、いくつかの方法があります。 – lurker

答えて

1

Lurkerに感謝します! 私は適切なアルゴリズムを使用していませんでした。私は2つの数字のGCDを見つけ、その結果と次のGCDのGCDを見つけることを考えましたが、どうして私はなぜこれがうまくいかないのか分かりません。とにかく

、ここでのコードは次のとおりです。

gcd(0,X,X):- X > 0, !. 
gcd(X,Y,Z):- X>=Y, X1 is X -Y, gcd(X1,Y,Z). 
gcd(X,Y,Z):- X<Y, X1 is Y-X, gcd(X1,X,Z). 
gcdL([H,H1|T],Z):-gcd(H,H1,X),gcdL([X|T],Z). 
gcdL([H1,H2],Z):-gcd(H1,H2,Z). 

そして好奇心のために、ここで私が達成しようとしていた遅れアプローチがあります。スクリプトが提供する最初の答えが正しいように私はほとんどそこにいましたが、それは逆行し続けます。とにかくそれは、醜い長く、ハードと非効率的です。撮影した

minel([X],X). 
minel([H,H1|T],X):-H>H1,minel([H1|T],X). 
minel([H,H1|T],X):-H=<H1,minel([H|T],X). 
gcdL(L,X):-gcdL(L,X,1). 
gcdL(L,X,C):-minel(L,M),C<M,delAll(L,C),Temp is C,C1 is C + 1,gcdL(L,R,C1),X is max(Temp,R). 
gcdL(L,X,C):-minel(L,M),C1 is C + 1,C1=<M,gcdL(L,X,C1). 
gcdL(L,X,C):-minel(L,M),C=:=M,X is 1. 
delAll([T],X):- 0 is mod(T,X). 
delAll([H|T],X):- 0 is mod(H,X),delAll(T,X) 

注:最初にスクリプトに問題を試した後、最も適切なアルゴリズムを見つけます。

+1

もう少し一般的になりたければ、 'gcd/3'にいくつかの節を追加して、負の数で動作させることができます。ネガティブのGCDは、それらの数の絶対値のGCDです。 – lurker

+0

ありがとう、私は余裕を持っていればそれを試してみます。 –

関連する問題