swift 中的递归斐波那契函数

Recursive Fibonacci function in swift

提问人:joseph.a 提问时间:8/29/2020 最后编辑:pawello2222joseph.a 更新时间:8/31/2020 访问量:584

问:

我尝试为斐波那契数列编写递归函数。 我使用数组来保存预先计算的元素以改进算法(这是一种常见的方法)。

这是我的代码:

var n = Int(readLine()!)

var arr = [Int](repeating:0, count:n!)
arr[0] = 1
arr[1] = 1
arr[2] = 2


func fib(n : Int, arr: inout [Int]) -> (Int,[Int]){

    if arr[0] != 0 {
        return (arr[n],arr)
    }

    arr[n] = fib(n: n - 1,arr: &arr).0 + fib(n: n - 2,arr: &arr).0
    return (arr[n],arr)
}
n! -= 1
print(fib(n:n! ,arr: &arr).0)

通知:3 < n

任何整数的答案都是 0。

我该如何解决?

我知道使用全局变量要容易得多(用于保存操作),但我不知道该怎么做。

SWIFT 函数 递归 序列 斐波那契

评论

0赞 Martin R 8/29/2020
Xcode 带有一个不错的调试器。您可以设置断点、单步、检查变量。程序执行流程在什么时候与您预期不符?

答:

2赞 Sweeper 8/29/2020 #1

错误似乎出在第一个 if 语句中:

if arr[0] != 0 {
    return (arr[n], arr)
}

如果数组的第一个元素不是 0,则返回 。好吧,总是 1,所以条件总是为真,但对于所有 n >= 3 最初都是 0,这就是导致观察到的行为的原因。arr[n]arr[0]arr[n]

我想你的意思是说:

if arr[n] != 0 {

此外,该函数不需要返回数组,因为您正在使用 - 通过引用传递数组。你没有在任何地方使用元组的第二项,是吗?所以这个函数可以写成:inout

func fib(n : Int, arr: inout [Int]) -> Int {

    if arr[n] != 0 {
        return arr[n]
    }

    arr[n] = fib(n: n - 1,arr: &arr) + fib(n: n - 2,arr: &arr)
    return arr[n]
}
0赞 user3098702 8/31/2020 #2
func fibonacciOf(_ number: Int) -> Int {
    if number == 1 || number == 2 {
        return 1
    }

    return fibonacciOf(number - 2) + fibonacciOf(number - 1)
}

print(fibonacciOf(5))

评论

0赞 joseph.a 9/1/2020
谢谢。这是正确的,但我正在寻找最快的方法(尽管在这种情况下 for 循环更快)