Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions docs/function.md
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Fibonacci2(100) // 354224848179262000000
Fibonacci2(1000) // 4.346655768693743e+208
Fibonacci2(10000) // Infinity
```

由此可见,“尾调用优化”对递归操作意义重大,所以一些函数式编程语言将其写入了语言规格。ES6也是如此,第一次明确规定,所有ECMAScript的实现,都必须部署“尾调用优化”。这就是说,在ES6中,只要使用尾递归,就不会发生栈溢出,相对节省内存。

### 递归函数的改写
Expand Down