首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Erlang结果累加器

Erlang结果累加器
EN

Stack Overflow用户
提问于 2015-05-30 09:29:55
回答 2查看 192关注 0票数 1

我正在编写一个程序,它收集所有毕达哥拉斯三元组的值等于一个给定的数字;例如,调用main(12)应该返回[{3,4,5}]。但是当我运行我的代码时,答案是[]。你能告诉我我做错了什么吗?

代码语言:javascript
复制
-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 ]).
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。让我们把它写在一个清单理解中:

代码语言:javascript
复制
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.

试一试:

代码语言:javascript
复制
2> Pyt(12).
[{5,4,3}]
3> Pyt(20).
[]
4> Pyt(90).
[{39,36,15},{41,40,9}]
票数 0
EN

Stack Overflow用户

发布于 2015-05-30 10:55:47

您正在调用函数的2部分,它返回Acc = []。

还应该注意,Erlang中的所有变量都是不变的,因此不能编写:Acc =lists:append(Acc,[{A,B,C}])

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30544488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档