累加器中的 Erlang 结果
Erlang result in accumulator
我正在尝试编写一个程序来收集所有等于给定数字的毕达哥拉斯三元组;例如,调用 main(12)
应该 return [{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 部分,return Acc = [].
还应该注意,Erlang 中的所有变量都是不可变的,因此您不能这样写:Acc =lists:append(Acc,[{A,B,C}])
你提出的代码有很多问题。
首先,if 语句中只有一种情况,因此如果 A+B+C 与 N 不同,它将崩溃(尝试使用 main(20))。
在 find_triple 函数中你给变量 Acc 赋值 4 次,记住变量在 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=N-A-B 且条件 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}]
我正在尝试编写一个程序来收集所有等于给定数字的毕达哥拉斯三元组;例如,调用 main(12)
应该 return [{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 部分,return Acc = [].
还应该注意,Erlang 中的所有变量都是不可变的,因此您不能这样写:Acc =lists:append(Acc,[{A,B,C}])
你提出的代码有很多问题。
首先,if 语句中只有一种情况,因此如果 A+B+C 与 N 不同,它将崩溃(尝试使用 main(20))。
在 find_triple 函数中你给变量 Acc 赋值 4 次,记住变量在 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=N-A-B 且条件 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}]