2015-11-19 50 views
3

我試圖在NetLogo中生成一個包含數字0到n的幾個不同唯一列表的列表。例如,我有這行代碼在NetLogo中生成列表的排列

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

fwiw,http://rosettacode.org/wiki/Permutations提供了許多編程語言的解決方案。可能計劃一將是最容易移植到NetLogo的 –

回答

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