Erlang导致累加器

d

我正在尝试编写一个程序,该程序收集等于给定数字的所有毕达哥拉斯三元组。例如,调用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 ]).
帕斯卡

您提出的代码中有很多问题。

首先,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到A-1的范围内,并且C = NAB且条件B> 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}]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章