こんにちは私はPrologで数字のリストのGCDを見つけようとしていますが、それをすることはできません。 助けてくれますか?Prolog数字のリストのGCDを見つける
私はまだほとんど閉じていないので、今まで私の仕事を分かち合っていません。 PP:これを解決しようとする過程で、私は解決できない別の問題に遭遇しました。もしあなたがこの手助けもできれば、私は感謝します。それは2つの数のすべての共通の除数を見つけることです。
ありがとうございます!
こんにちは私はPrologで数字のリストのGCDを見つけようとしていますが、それをすることはできません。 助けてくれますか?Prolog数字のリストのGCDを見つける
私はまだほとんど閉じていないので、今まで私の仕事を分かち合っていません。 PP:これを解決しようとする過程で、私は解決できない別の問題に遭遇しました。もしあなたがこの手助けもできれば、私は感謝します。それは2つの数のすべての共通の除数を見つけることです。
ありがとうございます!
私はこのリンクがあなたを助けると信じています。 https://math.stackexchange.com/questions/8611/number-of-common-divisors-between-two-given-numbers あなたはテーブルに数値を格納することができます。
この回答には十分な詳細があるかどうかわかりません。間違いなくリンクを提供するだけでは十分ではありません。 –
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)
注:最初にスクリプトに問題を試した後、最も適切なアルゴリズムを見つけます。
もう少し一般的になりたければ、 'gcd/3'にいくつかの節を追加して、負の数で動作させることができます。ネガティブのGCDは、それらの数の絶対値のGCDです。 – lurker
ありがとう、私は余裕を持っていればそれを試してみます。 –
興味深い:[RosettaCode - GCD - Prolog](http://rosettacode.org/wiki/Greatest_common_divisor#Prolog) –
このサイトからProlog GCDを検索することができます。私はあなたが何かを見つけるだろうと確信しています。 – lurker
GCDの計算方法に関する一般的な算術戦略を決めましたか? Prologとは独立して、いくつかの方法があります。 – lurker