费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。 首几个费波那契系数是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233…… 特别指出:0不是第一项,而是第零项。 显然可以用程序来求斐波那契数列,那么请问斐波那契第5000项是多少? 赶快试一试吧~
解法一:应该很快能写出来:
1 2 3 4 5 6 7 8 9 10 11 12 function fibonacci (n ) { if (n < 3 ) { return 1 } return fibonacci (n - 1 ) + fibonacci (n - 2 ) } fibonacci (30 ) fibonacci (40 ) fibonacci (50 )
看来以上方法性能太差了,因为递归太深了,下面来进行优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 function fibonacci (n ) { let fib1 = 1 let fib2 = 1 let fib3 if (n < 3 ) { return 1 } for (let i = 0 ; i < n - 2 ; i++) { fib3 = fib1 + fib2 fib1 = fib2 fib2 = fib3 } return fib3 } fibonacci (1476 ) fibonacci (1477 ) function fibonacci (n, fib1 = 1 , fib2 = 1 ) { if (n === 1 ) { return fib1 } else { return fibonacci (n - 1 , fib2, fib1 + fib2) } } fibonacci (1476 ) fibonacci (1477 ) function fibonacci (n, cache = [0 , 1 , 1 ] ) { let value = cache[n] if (value) { return value } else { let newVal = fibonacci (n - 1 , cache) + fibonacci (n - 2 , cache) cache.push (newVal) return newVal } } fibonacci (1475 ) fibonacci (1476 ) fibonacci (1477 ) Number .MAX_VALUE
目前经过测试最多只能算到1476项,因为JS能表示最大的数Number.MAX_VALUE
为1.7976931348623157e+308
,能不能想办法求更多项呢? 首先自定义大整数加法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 function bigPlus (a, b ) { let x = a.split ('' ).map (it => Number (it)) let y = b.split ('' ).map (it => Number (it)) let m = x.length - 1 let n = y.length - 1 let l = (m >= n ? m : n) + 2 let sum = new Array (l).fill (0 ) for (let i = l - 1 ; i > 0 ; i--) { sum[i] = (x[m] == undefined ? 0 : x[m]) + (y[n] == undefined ? 0 : y[n]) + sum[i] sum[i - 1 ] = parseInt (sum[i] / 10 ) sum[i] %= 10 m-- n-- } if (sum[0 ] == 0 ) { sum.shift () } return sum.join ('' ) } function fibonacci (n, fib1 = '1' , fib2 = '1' ) { if (n === 1 ) { return fib1 } else { return fibonacci (n - 1 , fib2, bigPlus (fib1, fib2)) } } fibonacci (10 ) fibonacci (3000 ) fibonacci (5000 )
完