快速递归斐波那契函数

时间:2020-08-29 07:37:23

标签: swift function recursion sequence fibonacci

我试图为Fibonacci序列编写递归函数。 我使用数组保存预先计算的元素以改进算法(这是一种常用的方法)。

这是我的代码:

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的任何整数的答案。

我该如何解决?

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

2 个答案:

答案 0 :(得分:2)

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

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

如果数组的 first 元素不为0,则返回arr[n]。好吧,arr[0]始终为1,因此条件始终为true,但是对于所有n> = 3,arr[n]最初为0,这就是导致观察到的行为的原因。

我想你是说:

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]
}

答案 1 :(得分:0)

func fibonacciOf(_ number: Int) -> Int {
    if number == 1 || number == 2 {
        return 1
    }

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

print(fibonacciOf(5))