Erlang导致累加器

时间:2015-05-30 09:29:56

标签: erlang

我试图写一个收集所有毕达哥拉斯三元组等于给定数字的程序;例如,调用main(12)应该返回[{3,4,5}]。但是当我运行我的代码时,答案是[]。你能告诉我我做错了吗?

-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 ]).

2 个答案:

答案 0 :(得分:1)

你正在召唤2部分函数,​​返回Acc = [] 还应该注意Erlang中的所有变量都是不可变的,所以你不能写:Acc =lists:append(Acc,[{A,B,C}])

答案 1 :(得分:0)

您提出的代码中存在许多问题。

首先,在if语句中只有一个案例,所以如果A + B + C与N不同则会崩溃(尝试使用main(20))。

在find_triple函数中你赋予4次变量Acc,记住变量在erlang中是不可变的。

您的代码似乎仅针对N = 12的情况编写,但我看不出您要使用的算法是什么。

您可以使用列表推导轻松解决此问题。假设你正在寻找pytagorician triplet {A,B,C},其中A&gt; B> C> 0,A 2 == B 2 + C 2和A + B + C == N。

然后A必须在3至N-2的范围内,B在2至A-1的范围内,并且C = N-A-B,条件B> 1。 C和C> 0.让我们在列表中写出这个:

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}]