接收和执行以下函数有什么问题:
func FibFast(num: Int) -> Array<Int> {
var fib_arr = [Int](num)
if num < 1 {
fib_arr[0] = 0
return fib_arr
} else if num < 2 {
fib_arr[1] = 1
return fib_arr
}else {
for var i = 2; i < num; i++ {
fib_arr[i] = fib_arr[i-1] + fib_arr[i-2]
}
return fib_arr
}
}
当我尝试接收数组时:
var newArray = FibFast(10)
它导致执行不良。
答案 0 :(得分:2)
您正在尝试使用不存在的索引下标数组,类似地,在您的情况下,当数组为空时,您尝试下标到索引2。
行var fib_arr = [Int]()
在整数上创建一个空数组。当您使用fib_arr[0] = 0
时,您试图将索引0处的值赋值为0但当前不存在任何值。我建议使用append(_)
方法,即。 fib_arr.append(0)
。
当您传入值10或任何2或更多作为num
参数的内容时,您的if-else if-else
语句正在执行for循环,您尝试访问0
索引未被设置为早期语句的1}}和1
从未执行过,因为它们被if-else if-else
块跳过。
for循环并使用下标分配值非常表明您可能在swift之前学习了不同的语言。你应该注意到你试图使用的经典c风格for循环将很快从swift中删除,所以最好不要使用它。我已经将您的代码重写为与您编写代码的方式非常接近,请不要犹豫,询问您是否对此有任何疑问。
func fib(num: Int) -> [Int] {
var fib_arr = [Int]()
if num == 0 {
fib_arr.append(0)
} else if num == 1 {
fib_arr.append(0)
fib_arr.append(1)
} else {
fib_arr = [0, 1]
for i in 2..<num {
fib_arr.append(fib_arr[i - 1] + fib_arr[i - 2])
}
}
return fib_arr
}
答案 1 :(得分:1)
Blake Lockley提出的答案也可以这样编码:
func FibFast(num: Int) -> Array<Int> {
var fib_arr = [Int]() // empty array
if num < 1 {
fib_arr += [0] // add element [0]
return fib_arr
} else if num < 2 {
fib_arr += [0] // add element [0]
fib_arr += [1] // add element [1]
return fib_arr
}else {
fib_arr = [0, 1] // init with [0, 1]
for var i = 2; i < num; i++ {
// add computed element
fib_arr += [fib_arr[i-1] + fib_arr[i-2]]
}
return fib_arr
}
}