Erlang排列组合示例中引发对列表解析的一些疑问

发布于 2021-12-02 23:13:12 字数 1051 浏览 721 评论 1

大家好!

新手一枚,正在通过一本叫做 《Erlang程序设计中文版》 的文档进行自学,碰到一些问题卡住了。比较纠结。

问题出现在书(pdf)中一段用 "列表解析" 进行 "排列组合" 的代码:

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

按照我对列表的初级认识:

[1,2] = [1 | [2]].
 [1 | [2]] = [1 | [2 | [] ]].

那么二维list呢?比如上面的perms函数,在参数为[]的时候返回的是一个[[]]。

一步步看下:

%% 我们只看第一条执行线路,其他先忽略
  1  perms("12") -> [[1 | perms([2])]].
  2  perms("2") -> [[ 2 | perms([])]].
  3  perms([]) -> [[]].

综上:perms("12")第一条线路返回的是 [[1|[[2|[[]]]]]] 这个在Erlang shell 里的执行结果是 [[1, [2, [] ]]]. 而不是 [[1, 2, 3]]. 说明推导是错误的,想知道编译的时候发生了什么事。


请高手指点迷津,不胜感激!







如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚如初 2021-12-03 22:37:28

首先,

perms([]) -> [[]];

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

这个函数的意思是,如果参数为空,直接返回元素是空列表的列表;然后不是空的情况下,从参数L中依次选取一个元素和剩余的其他元素列表进行排列。

所以参数为“12”的情况是,1和剩余的元素”2“列表、2和剩余的元素"1"列表进行排列。

元素为2的列表排列结果是[2 | []], 也就是[2], 前面排1,就是”12“。

元素为2的列表排列结果是[1 | []], 也就是[1], 前面排2,就是”21“。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文