1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

增加fibonacci 尾递归算法

阮老师你好,阅读完您关于 尾递归这方面的研究书稿后,我自己使用了尾递归实现了计算fibonacci数列的方法,觉得比较有代表性

由非尾递归的fibonacci数列的  和 尾递归的fibonacci数列 比较,更加说明尾递归优化的重要性

此外fibonacci数列也是测试性能的常用算法

如果因为我的理解不深刻,浪费了老师宝贵时间,望老师见谅
This commit is contained in:
Owen 2016-05-23 11:32:06 +08:00
parent 3bd3d6fbdb
commit d4640a262d

View File

@ -1195,6 +1195,37 @@ function factorial(n, total) {
factorial(5, 1) // 120
```
还有一个比较著名的例子就是计算fibonacci 数列,也能充分说明尾递归优化的重要性
如果是非尾递归的fibonacci 递归方法
```javascript
function Fibonacci (n) {
if ( n <= 1 ) {return 1};
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Fibonacci(10); // 89
// Fibonacci(100)
// Fibonacci(500)
// 堆栈溢出了
```
如果我们使用尾递归优化过的fibonacci 递归算法
```javascript
function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {
if( n <= 1 ) {return ac1};
return Fibonacci2 (n-1 , ac2 , ac1 + ac2);
}
console.log(Fibonacci2(100)) // 354224848179262000000
console.log(Fibonacci2(1000)) // 4.346655768693743e+208
console.log(Fibonacci2(10000)) // Infinity
```
由此可见“尾调用优化”对递归操作意义重大所以一些函数式编程语言将其写入了语言规格。ES6也是如此第一次明确规定所有ECMAScript的实现都必须部署“尾调用优化”。这就是说在ES6中只要使用尾递归就不会发生栈溢出相对节省内存。
### 递归函数的改写