gpt4 book ai didi

recursion - Erlang - 递归后列表/元组层次结构的问题

转载 作者:行者123 更新时间:2023-12-01 22:00:17 25 4
gpt4 key购买 nike

此递归生成的树不是我想要的,这可能证明我不完全理解递归中列表/元组的行为。如果有人可以解释我在这个例子中做错了什么,并解释正确的思考方式,我将非常感激。

move([],{Main, One, Two}) ->
{Main, One, Two};
move([X|Xr], {Main, One, Two}) ->
[{Main, One, Two}, move(Xr, single(X, {Main, One, Two}))].

期望的结果(一个包含 3 个元组的列表):

[{[a,b],[],[]}, {[a],[b],[]}, {[],[b],[a]}, {[b],[],[a]}]

实际结果(包含元组和列表的列表,包含元组和列表...):

[{[a,b],[],[]},[{[a],[b],[]},[{[],[b],[a]},[{[b],[],[a]}]]]]

最佳答案

您有两个问题:

  1. 正如@nmichaels 提到的那样,| 而不是 ,
  2. 函数move/2 返回一个列表,因此终止子句也必须返回一个列表。这在您的示例中没有看到,因为第一个问题隐藏了它。

因此生成的代码将是:

move([X|Xr], {Main, One, Two}) ->
[{Main, One, Two} | move(Xr, single(X, {Main, One, Two}))];
move([], {Main, One, Two}) ->
[{Main, One, Two}].

我翻转了子句的顺序,因为我个人更喜欢这样写。在这种情况下没有根本区别。我假设 single/2 返回一个元组。

您实际上可以通过从 move/2 中删除元组的所有知识来优化此代码,因为它实际上从未使用内部结构。所以:

move([X|Xr], Tuple) ->
[Tuple | move(Xr, single(X, Tuple))];
move([], Tuple) ->
[Tuple].

关于recursion - Erlang - 递归后列表/元组层次结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com