【发布时间】:2014-09-29 12:19:18
【问题描述】:
我正在尝试使用 Apple 的 Swift 编程语言生成一个包含所有重复组合的嵌套数组。
可以在本页底部附近找到关于重复组合的详细说明:http://www.mathsisfun.com/combinatorics/combinations-permutations.html
简单地说;顺序无关紧要,我们可以重复
n = 我们选择形式的事物集合
r = 我们选择的东西的数量
我想创建一个函数,该函数将生成一个嵌套数组,其中包含所有组合,并且对于 n 和 r 的任何(小)值都有重复。
如果有 n=3 个东西可供选择,我们选择其中 r=2 个。
n = [0, 1, 2]
r = 2
函数combos(n: [0, 1, 2], r: 2) 的结果是:
result = [
[0, 0],
[0, 1],
[0, 2],
[1, 1],
[1, 2],
[2, 2]
]
// we don't need [1, 0], [2, 0] etc. because "order does not matter"
这里有许多编程语言的示例:http://rosettacode.org/wiki/Combinations_with_repetitions
这是 PHP 示例。它是最简单的一种并返回一个数组,这正是我想要的:
function combos($arr, $k) {
if ($k == 0) {
return array(array());
}
if (count($arr) == 0) {
return array();
}
$head = $arr[0];
$combos = array();
$subcombos = combos($arr, $k-1);
foreach ($subcombos as $subcombo) {
array_unshift($subcombo, $head);
$combos[] = $subcombo;
}
array_shift($arr);
$combos = array_merge($combos, combos($arr, $k));
return $combos;
}
到目前为止,我已经将函数移植到 Swift:
func combos(var array: [Int], k: Int) -> AnyObject { // -> Array<Array<Int>> {
if k == 0 {
return [[]]
}
if array.isEmpty {
return []
}
let head = array[0]
var combos = [[]]
var subcombos: [Array<Int>] = combos(array, k-1) // error: '(@Ivalue [Int], $T5) -> $T6' is not identical to '[NSArray]'
for subcombo in subcombos {
var sub = subcombo
sub.insert(head, atIndex: 0)
combos.append(sub)
}
array.removeAtIndex(0)
combos += combos(array, k) // error: '(@Ivalue [Int], Int) -> $T5' is not identical to '[NSArray]'
return combos
}
大多数情况下,我似乎对各种变量的类型声明以及这些变量是可变的还是不可变的都有问题。
我尝试过使用类型声明更加明确和不明确,但我设法实现的只是错误消息略有不同。
如果有人能解释我哪里出错以及为什么出错,我将不胜感激?
【问题讨论】:
标签: arrays function swift combinations