Я новичок в Netlogo, а также программирую и борюсь со следующей проблемой: мне нужно реализовать функцию Permu [k,n]
в Netlogo, где k - это список элементов, например, [1 2]
, а n - длина получающегосясписок например 3
.Функция должна возвращать все списки перестановок, скажем, длиной n, где элементы взяты из k.
Пример 1: Permu [1 2] 3
должен возвращать в результате все перестановки с повторениями [[1 1 1] [1 1 2] [1 2 1] [1 2 2] [2 1 1] [2 1 2] [2 2 1] [2 2 2]]
Пример2: Permu [1 2 3] 2
должен вернуть [[1 1] [1 2] [1 3] [2 1] [2 2] [2 3] [3 1] [3 2] [3 3]]
На самом деле эквивалентная функция в Mathematica будет Tuples[{1,2},3]
Я уже проверил сообщение Генерация перестановок списка в NetLogo , но не смог настроить его под мои нужды.
У вас есть идеи, как это сделать, или вы знаете какой-то псевдокод?Заранее спасибо!
Редактировать
Я придумал (плохое) решение, просто создав случайные списки, состоящие из элементов из k, пока не будут найдены все возможные комбинации:
to-report permu [k n]
let number-of-all-combinations ( length k ) ^ n ;; stopping condtion
let results []
let temp-results []
while [ length results < number-of-all-combinations ] [
set temp-results []
repeat n [ set temp-results fput (one-of k) temp-results ]
if not member? temp-results results [set results fput temp-results results ] ;; makes sure that there are no duplicates in the result.
]
report results
end
Я бы все равно оценил лучшую альтернативу. Спасибо!