美文网首页
21. 什么是尾调用,使用尾调用有什么好处?

21. 什么是尾调用,使用尾调用有什么好处?

作者: Angle_Ch | 来源:发表于2023-02-15 15:06 被阅读0次

一、什么是尾调用

尾调用指的是函数的最后一步调用另一个函数。

如下所示为尾调用:

function f(x) {
    return g(x)
}

function b(num) {
  return c(num + 2)
}

下面的两种情况都不属于尾调用:

function f(x){
    let y = g(x)
    return y
}
function f(x){
    return g(x) + 1
}

二、为什么说尾调用的性能要比没有使用尾调用的性能好呢?

代码执行是基于执行栈的,所以当在一个函数里调用另一个函数时,会保留当前的执行上下文,然后再新建另外一个执行上下文加入栈中。

使用尾调用的话,因为已经是函数的最后一步,所以这时可以不必再保留当前的执行上下文,从而节省了内存,这就是尾调用优化。

但是 ES6 的尾调用优化只在严格模式下开启,正常模式是无效的。

三、尾递归

函数调用自身,叫做递归。如果尾调用自身,则就称为尾递归。

递归非常消耗内存,因为需要同时保存成千上万个调用记录,很容易发生栈溢出的错误。

但是对于尾递归来说,由于只存在一个调用记录,所以永远不会发生栈溢出。

  • 求阶乘的递归 ---- 容易造成内存的泄露
function factorial(n) {
  if (n === 1) return 1
  return n * factorial(n - 1)
}

console.log(factorial(5)) //120
  • 求阶乘的递归,优化成尾递归
function factorial(n, total) {
  if (n === 1) return total
  return factorial(n - 1, total * n)
}

console.log(factorial(5, 1))

参考地址:https://blog.csdn.net/weixin_47450807/article/details/123396329

相关文章

网友评论

      本文标题:21. 什么是尾调用,使用尾调用有什么好处?

      本文链接:https://www.haomeiwen.com/subject/oigekdtx.html