我正在编写一个程序,它收集所有毕达哥拉斯三元组的值等于一个给定的数字;例如,调用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 ]).发布于 2015-05-30 13:15:51
在您建议的代码中有许多问题。
首先,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到N2,B在范围2到A-1,C=N,条件是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}]发布于 2015-05-30 10:55:47
您正在调用函数的2部分,它返回Acc = []。
还应该注意,Erlang中的所有变量都是不变的,因此不能编写:Acc =lists:append(Acc,[{A,B,C}])
https://stackoverflow.com/questions/30544488
复制相似问题