我的斐波那契算法代码报Index out of range错误,求原因解析
斐波那契Swift代码“Index out of range”错误分析与解决
错误原因
你的代码核心问题出在数组下标赋值的逻辑上:
- 初始化
fibArray后,通过insert操作得到数组[0, 1],此时数组仅有2个元素,有效索引为0和1。 - 当循环从
2开始到目标值n(比如n=8)时,执行fibArray[i] = ...的操作,此时i=2对应的索引在当前数组中并不存在。Swift数组不允许直接通过下标给未初始化的位置赋值,必须确保索引已存在,否则就会抛出“Index out of range”错误。
解决方法
有两种简单的修正方案,都能解决数组越界问题:
方案1:使用append添加元素
直接在数组末尾追加计算好的斐波那契数,append会自动扩展数组容量,无需担心索引问题:
func fib(n: Int) -> Int { guard n >= 0 else { fatalError("n必须是非负整数") } if n == 0 { return 0 } if n == 1 { return 1 } var fibArray = [0, 1] for i in 2...n { fibArray.append(fibArray[i-1] + fibArray[i-2]) } return fibArray[n] } var a = fib(n: 8) print(a) // 输出21
方案2:预分配数组空间
提前创建一个长度为n+1的数组,确保所有需要的索引都已存在,之后直接通过下标赋值:
func fib(n: Int) -> Int { guard n >= 0 else { fatalError("n必须是非负整数") } var fibArray = Array(repeating: 0, count: n+1) if n >= 1 { fibArray[1] = 1 } for i in 2...n { fibArray[i] = fibArray[i-1] + fibArray[i-2] } return fibArray[n] } var a = fib(n: 8) print(a) // 输出21
两种方案都加入了对n为负数的判断,避免非法输入导致的额外问题。
内容的提问来源于stack exchange,提问作者maytime
相关产品推荐
相关产品推荐

