2015-05-30 2 views
2

Я пытаюсь написать программу, которая собирает все пифагорейские троек, равные заданному числу; например, вызов main(12) должен вернуть [{3,4,5}]. Но когда я запускаю свой код, ответ []. Можете ли вы сказать мне, что я делаю неправильно?Результат Erlang в аккумуляторе

-module(triples). 
-export([main/1]). 

t1(A, B, C) -> 
    {A-2*B+2*C, 2*A-B+2*C, 2*A-2*B+3*C}. 
t2(A, B, C) -> 
    {A+2*B+2*C, 2*A+B+2*C, 2*A+2*B+3*C}. 
t3(A, B, C) -> 
    {2*B+2*C-A, B+2*C-2*A, 2*B+3*C-2*A}. 

find_triples(A,B,C,Max,Acc) when (A+B+C) < Max -> 
    if 
     A+B+C == Max -> 
      Acc = lists:append(Acc,[{A,B,C}]) 
    end, 
    {A1,B1,C1} = t1(A,B,C), 
    Acc = find_triples(A1,B1,C1,Max,Acc), 
    {A2,B2,C2} = t2(A,B,C), 
    Acc = find_triples(A2,B2,C2,Max,Acc), 
    {A3,B3,C3} = t3(A,B,C), 
    Acc = find_triples(A3,B3,C3,Max,Acc); 
find_triples(_A,_B,_C,Max,Acc) -> 
    Acc. 
find_triples(Num) -> 
    find_triples(3,4,5,Num,[]). 

main(D) -> 
    Answer = find_triples(D), 
    io:fwrite("Wynik: ~w~n", [ Answer ]). 
+0

какой алгоритм вы хотите реализовать? –

+1

Я использую отношение, описанное здесь http://en.wikipedia.org/wiki/Pythagorean_triple#Parent.2Fchild_relationships – whd

ответ

1

В коде, который вы предлагаете, есть много проблем.

Во-первых, в утверждении if есть только один случай, поэтому, если A + B + C отличается от N, он сработает (попробуйте с помощью main (20)).

В функции find_triple вы назначаете 4 раза переменную Acc, помните, что переменная не изменяема в erlang.

Ваш код, кажется, написан только для случая, когда N = 12, хотя я не вижу, какой алгоритм вы хотите использовать.

Вы можете легко решить эту проблему со списком понятий. Пусть говорят, что вы ищете трипалет пифагорика {A, B, C}, где A> B> C> 0, A² = B² + C² и A + B + C == N.

Тогда A должно быть в диапазон от 3 до N-2, B в диапазоне от 2 до а-1, и с = НАБ с условиями B> с и с> 0 позволяет записать это в список comprehention:

1> Pyt = fun (N) -> [{A,B,C} || A <- lists:seq(3,N-2), B <- lists:seq(2,A-1),C <- [N-A-B], B>C, C>0, B*B+C*C == A*A] end. 

и попробовать его :

2> Pyt(12). 
[{5,4,3}] 
3> Pyt(20). 
[] 
4> Pyt(90). 
[{39,36,15},{41,40,9}] 
+0

хороший ответ. Можете ли вы объяснить, как определить диапазон для A и B? –

+0

для обеих переменных Я использую функцию 'lists: seq (From, To)', которые генерируют список целых чисел '[From, from + 1, ..., To]', тогда я использую эти списки как генератор в списке Понимание: 'A <- списки: seq (3, N-2)' и 'B <- lists: seq (2, A-1)'. – Pascal

+0

Спасибо, теперь я понимаю суть алгоритма. –

1

Вы делаете вызов 2 части функции, которые возвращают Acc = [].
Следует также отметить, что все переменные в Erlang неизменно, поэтому вы не можете писать: Acc =lists:append(Acc,[{A,B,C}])

Смежные вопросы