Swift 实现斐波那契 (Fibonacci) 数列

2019-06-11  本文已影响0人  奋进的小时光_Joe

Fibonacci 数列是一系列数字,除了第一个和第二个数字以外,任何数字都是前两个数字之和:

0、1、1、2、3、5、8、13、21、……

数列中的第一个 Fibonacci 数的值为 0,第四个 Fibonacci 数的值为 2,数列中第 n 个 Fibonacci 数的值可以通过下述公式计算:

fib(n) = fib(n - 1) + fib(n - 2)

1.通过递归实现

通过上述公式机械的翻译为 Fibonacci 函数第一版

func fib(n:UInt) -> UInt {
    return fib1(n: n-1) + fib1(n: n-2)
}

注:如果调用一个值来运行这个函数,则这个函数将会永远不停的运行,不会返回最终结果,我们称这种情况为无穷递归。

2.添加终止条件

func fib(n:UInt) -> UInt {
    if n < 2 {
        return n
    }
    return fib2(n: n - 1) + fib2(n: n - 2)
}

3.增加缓存,减少计算量

var fibMemo : [UInt : UInt] = [0:0, 1:1]
func fib(n:UInt) -> UInt {
    if let result = fibMemo[n] {
        return result
    } else {
        fibMemo[n] = fib3(n: n - 1) + fib3(n: n - 2)
    }
    return fibMemo[n]!
}

4.保持 Fibonacci 简单

解决 Fibonacci 数列性能更高的方法,还有老是迭代发。

func fib(n: UInt) -> UInt {
    if n == 0 {
        return n
    }
    
    var last :UInt = 0, next :UInt = 1
    for _ in 1..<n {
        (last, next) = (next, next + last)
     }
    return next
}

通过这种方法,for 循环的主体最多只需要运行 n-1 次!

上一篇下一篇

猜你喜欢

热点阅读