100道前端面试题(十): 求斐波那契数列的第n值(TS+单元测试)

164 阅读1分钟

前言

9-1.webp

今天我们来计算斐波那契数列


输入一个n值(int),计算前n项的斐波那契数列的第n值,后一项等于前两项之和

样例输出

样例输出

请看示例1:

输入: 6

输出: 8

请看示例2:

输入: 0

输出: 1

请看示例3:

输入: 1

输出: 1

请看示例4:

输入: 3

输出: 2

解题思路:方法一(递归)

 function fibonacci(n: number): number {
     if (n <= 0) return 0
     if (n === 1) return 1
     return fibonacci(n - 1) + fibonacci(n - 2)
 }

解题思路:方法二(双指针)

export function fibonacci(n: number): number {
    if (n <= 0) return 0
    if (n === 1) return 1

    let n1 = 1 // 记录 n-1 的结果
    let n2 = 0 // 记录 n-2 的结果
    let res = 0

    for (let i = 2; i <= n; i++) {
        res = n1 + n2

        // 记录中间结果
        n2 = n1
        n1 = res
    }

    return res
}


算法时间度分析

方法一递归一定不可取,因为递归的过程产生了大量的重复计算,如下图所示,方法一的实时间复杂度为O(2^n)

image.png

方法二,很明显,时间复杂度为O(n)

单元测试

import { fibonacci } from './fibonacci'

describe('斐波那契数列', () => {
    it('01', () => {
        expect(fibonacci(0)).toBe(0)
        expect(fibonacci(1)).toBe(1)
    })
    it('正常情况', () => {
        expect(fibonacci(2)).toBe(1)
        expect(fibonacci(3)).toBe(2)
        expect(fibonacci(6)).toBe(8)
    })
    it('n 小于 0', () => {
        expect(fibonacci(-1)).toBe(0)
    })
})