前言
今天我们来计算斐波那契数列
输入一个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)
方法二,很明显,时间复杂度为O(n)
单元测试
import { fibonacci } from './fibonacci'
describe('斐波那契数列', () => {
it('0 和 1', () => {
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)
})
})