在接收函数返回数组时执行不好的过量?

时间:2016-03-11 03:46:49

标签: arrays function swift2 return-value swift-playground

接收和执行以下函数有什么问题:

 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)

它导致执行不良。

2 个答案:

答案 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
    }
}