斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
前两项为1,从第三项起,每一项等于前两项的和,即F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
普通的递归写法
function fibonacci(n){ if(n <= 2){ return 1 }else{ return fibonacci(n - 1) + fibonacci(n - 2) } }问题:代码优美逻辑清晰。但是有重复计算的问题,如:当n为5的时候要计算fibonacci(4) + fibonacci(3),当n为4的要计算fibonacci(3) + fibonacci(2) ,这时fibonacci(3)就是重复计算了。运行 fibonacci(50) 会出现浏览器假死现象,毕竟递归需要堆栈,数字过大内存不够。
尾调用优化递归写法
function fibonacci(n) { function fib(n, pre = 1, next = 1) { if (n < 2) { return next } else { return fib(n - 1, next, pre + next) } } return fib(n) }此优化方法很好地解决了性能和堆栈问题,不过理解起来更费脑力
如何理解:当求第3个数时,把第2个数当成第1个数,第3个数当成第2个数……(只是个人理解,不正确欢迎指出,勿喷)