我试图写一个收集所有毕达哥拉斯三元组等于给定数字的程序;例如,调用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 ]).
答案 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}]