gpt4 book ai didi

erlang - Erlang 中的排列示例

转载 作者:行者123 更新时间:2023-12-02 06:34:26 26 4
gpt4 key购买 nike

我有一个关于 Erlang Perms 实现的问题:

 perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].

上面的代码来自一本名为Erlang编程的书,看起来很简单,但是运行完美。我感到困惑的是它是如何工作的。比如我们用perms("12")这样的参数来运行它,那么我们分析一下递归的过程。我认为第一个返回的结果将类似于 [[1|perms[2]->[[2]|[[]]]] ,这等于 [[1|[[ 2]|[[]]]]。但在 Erlang shell 中这是一个错误的表达式。

最佳答案

列表理解的一般行为是生成所有生成器的叉积(在应用定义的过滤器之后)。通过一个例子可以更好地说明:

1> [{X,Y} || X <- [1,2,3], Y <- [a,b,c]].
[{1,a},{1,b},{1,c},{2,a},{2,b},{2,c},{3,a},{3,b},{3,c}]
2>

在排列代码示例中,列表理解是这样执行的:

H <- L是一个生成器,它将为输入列表 L 的每一项生成一个值。在您的情况下,L =“12”,它将生成 2 项字符 $1$2 ,它将与第二个生成器的结果构建叉积: T <- perms(L--[H])

这里有一些非常聪明的东西,第二个生成器依赖于第一个生成器,第一个生成器的每个元素将与第二个生成器中自己的列表组合。所以$1将与 perms(L--[$1]) 生成的项相结合=perms("2")

如果您尝试评估 perms("2") ,相同的分析表明第一个生成器生成一个单项 $2perms([]) 结合

最后一项的计算结果为[[]]并将生成一个空列表。

我们现在可以构建中间结果:[[H|T]] = [[$2|[]]] = [[$2]] .

此结果将生成单个项 [$2] 。因此顶级结果将是(考虑到所有生成的项)[[$1|[$2]],[$2|[$1]] = [[$1,$2],[$2,$1]] = ["12","21"] .

关于erlang - Erlang 中的排列示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179283/

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