Erlang排列组合示例中引发对列表解析的一些疑问
大家好!
新手一枚,正在通过一本叫做 《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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,
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“。