mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-29 05:42:20 +00:00
commit
f7494bc67e
@ -1209,6 +1209,37 @@ function factorial(n, total) {
|
|||||||
factorial(5, 1) // 120
|
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中,只要使用尾递归,就不会发生栈溢出,相对节省内存。
|
由此可见,“尾调用优化”对递归操作意义重大,所以一些函数式编程语言将其写入了语言规格。ES6也是如此,第一次明确规定,所有ECMAScript的实现,都必须部署“尾调用优化”。这就是说,在ES6中,只要使用尾递归,就不会发生栈溢出,相对节省内存。
|
||||||
|
|
||||||
### 递归函数的改写
|
### 递归函数的改写
|
||||||
|
Loading…
x
Reference in New Issue
Block a user