2017-01-19 23 views
-1

Здравствуйте, я пытаюсь найти GCD списка чисел в Prolog, но я не могу этого сделать. Не могли бы вы помочь?Пролог найти GCD списка чисел

Я даже не совсем близко, поэтому до сих пор не хочу делиться какой-либо своей работой. PP: В процессе попытки решить эту проблему я столкнулся с другой проблемой, которую я не могу решить, если вы тоже можете помочь с этим, я буду благодарен. Он находит все общие делители двух чисел.

Спасибо!

+0

Интересует: [RosettaCode - GCD - Prolog] (http://rosettacode.org/wiki/Greatest_common_divisor#Prolog) –

+0

Вы можете выполнить поиск этого сайта для Prolog GCD. Я уверен, что вы что-то найдете. – lurker

+2

Вы решили использовать общую арифметическую стратегию для того, как вы хотите вычислить свой GCD? Существует несколько способов сделать это независимо от Пролога. – lurker

ответ

-1

Я считаю, что эта ссылка поможет вам https://math.stackexchange.com/questions/8611/number-of-common-divisors-between-two-given-numbers настаивать на подсчете, вы можете хранить номера на столе, например.

+2

Я не уверен, что у этого ответа достаточно деталей; просто предоставление ссылки определенно недостаточно. –

1

Благодаря Lurker! Я не использовал правильный алгоритм. Я думал о том, чтобы найти 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

Спасибо, я буду возиться с этим, если у меня есть свободное время. –