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