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

crispdog 发布于 2015/12/14 13:13
阅读 302
收藏 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]]. 说明推导是错误的,想知道编译的时候发生了什么事。


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







加载中
0
格通
格通

首先,

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“。

返回顶部
顶部