尾调用
Tail Call 是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数。
1 2 3
| function f(x) { return g(x) }
|
尾调用不一定出现在函数尾部,只要是最后一步操作即可。
1 2 3 4
| function f(x) { if (x > 0) return t(x) return m(x) }
|
尾调用优化
函数调用会在内存中形成一个 call frame,保存调用位置和内部变量等信息。所有的 call frame 形成一个 call stack。
尾调用由于是函数的最后一步操作,所以不需要保留外层函数的 call frame,这就叫 Tail Call Optimization,即只保留内层函数的调用帧。
尾递归
递归非常耗内存,因为需要同时保存多个 call frame,很容易发生 stack overflow。但对于尾递归来说,由于只存在一个 call frame,所以不会发生溢出。
1 2 3 4 5 6 7
| function Fibonacci(n) { if (n <= 1) return 1 return Fibonacci(n - 1) + Fibonacci(n - 2) } console.log(Fibonacci(10)) console.log(Fibonacci(100)) console.log(Fibonacci(500))
|