Erlang中随机生成列表并删除另一列表元素的问题求助
解决Erlang列表差集未生效的问题
嘿,刚看了你的代码,问题其实出在列表的嵌套上,我来给你拆解一下~
核心问题分析
你写的代码里,R1 = [[rand:uniform(10) || _ <- lists:seq(1, 10)]] 用了两层方括号,这导致R1不是一个普通的数字列表,而是一个「包含了一个数字列表的列表」,R2也是同样的结构。
Erlang的--操作符是用来求列表差集的,它的逻辑是:遍历左边列表的每个元素,只要这个元素完整出现在右边列表里,就把它从结果中移除。但你的R1里的唯一元素是那个内部的数字列表,R2里的唯一元素是另一个随机生成的数字列表——这两个列表几乎不可能完全相同,所以R1 -- R2的结果还是R1本身,自然看不到任何元素被删除的效果。
修正后的代码
把多余的一层方括号去掉,让R1和R2直接成为数字列表就可以了:
generate_number() -> R1 = [rand:uniform(10) || _ <- lists:seq(1, 10)], R2 = [rand:uniform(10) || _ <- lists:seq(1, 10)], R3 = R1 -- R2, io:format("Original List 1: ~p~n", [R1]), io:format("Original List 2: ~p~n", [R2]), io:format("Final List: ~p~n", [R3]).
额外说明
- 这个修正后的代码会移除R1中所有在R2里出现过的元素(比如如果R1里有三个
7,R2里有一个7,--会把R1里的三个7都删掉)。 - 如果你的需求是只删除和R2元素对应的次数(比如R1里三个
7,R2里一个7,只删一个),那需要自己实现递归遍历匹配的逻辑。
内容的提问来源于stack exchange,提问作者MochaShakaKhan
相关产品推荐
相关产品推荐

