我试图在NetLogo中生成一个列表,其中包含数字0到n的几个不同的唯一列表。例如,我有这行代码
set mylists [[0 1 2] [0 2 1] [1 0 2] [1 2 0] [2 0 1] [2 1 0]]
我写了所有可能的0 1和2的唯一组合,而不重复列表中的数字。我想能够做同样的事情但是有更大的n。有没有一个如何做到这一点的例子,或某种伪代码算法,任何人都知道我可以检查出来?谢谢!
答案 0 :(得分:5)
如果你不介意递归解决方案,你可以这样做:
to-report permutations [#lst] ;Return all permutations of `lst`
let n length #lst
if (n = 0) [report #lst]
if (n = 1) [report (list #lst)]
if (n = 2) [report (list #lst reverse #lst)]
let result []
let idxs n-values n [?]
foreach idxs [
let xi item ? #lst
foreach (permutations remove-item ? #lst) [
set result lput (fput xi ?) result
]
]
report result
end
修改:更新语法以回应评论。
to-report permutations [#lst] ;Return all permutations of `lst`
let n length #lst
if (n = 0) [report #lst]
if (n = 1) [report (list #lst)]
if (n = 2) [report (list #lst reverse #lst)]
let result []
let idxs range n
foreach idxs [? ->
let xi item ? #lst
foreach (permutations remove-item ? #lst) [?? ->
set result lput (fput xi ??) result
]
]
report result
end