【问题标题】:How does recursive functions keep count when searching for maximum depth of binary tree javascript搜索二叉树javascript的最大深度时,递归函数如何保持计数
【发布时间】:2021-04-23 02:44:36
【问题描述】:
 var maxDepth = function(root) {
     const recursion = (n) => {
         if (!n) return 0;
        
         let left = recursion(n.left)
         let right = recursion(n.right)
         return left > right ? left + 1 : right + 1
     }
     return recursion(root)
 };

调用递归函数时,它是如何记数的?我见过很多其他方法来找到二叉树的最大深度,并且所有递归函数都可以自己计算。谁能解释一下这是如何工作的?函数调用加 1 是如何工作的?

这是另一种搜索方法

  maxDepth() {
    if (!this.root) return 0;

    function maxDepthHelper(node) {
      if (node.left === null && node.right === null) return 1;
      if (node.left === null) return maxDepthHelper(node.right) + 1;
      if (node.right === null) return maxDepthHelper(node.left) + 1;
      return (
        Math.max(maxDepthHelper(node.left), maxDepthHelper(node.right)) + 1
      );
    }

    return maxDepthHelper(this.root);
  }

这是二叉树类方法的一部分

【问题讨论】:

  • 您所说的“它是如何计数的?”是什么意思?它只计算递归调用级别。

标签: javascript recursion binary-tree recursive-datastructures


【解决方案1】:

您问,“函数调用加 1 是如何工作的?”请注意,maxDepthHelper(...) 返回一个数字。所以,发生的事情是函数调用的 result 是一个数字,而该结果是加 1 的结果。因此,如果在特定情况下 maxDepthHelper(...) 产生 6,那么 maxDepthHelper(...) + 1只有 7 岁。

对于您更一般的问题,“它是如何计数的?”它没有。调用堆栈将包含对maxDepthHelper 的许多递归调用,其中许多调用将在返回值上执行+ 1。这些添加物堆积起来,最终产生最终结果。同样的想法:

const count = (n = 0) => {
   if (n < 1000) {
       return count(n + 1)
   }
   return n
}

count() // 1000

这里没有什么是“跟踪”的。传递了n 变量,它的值随着调用堆栈变大而累积。

【讨论】:

  • ``` var maxDepth = function(root) { const recursion = (n) => { if (!n) return 0;让左=递归(n.left)让右=递归(n.right)返回左>右?左 + 1 : 右 + 1 } 返回递归(根) }; ``` 所以在这个例子中,变量“left”保存了函数调用的计数?如果是,是什么计算呼叫或数字是如何产生的?
  • 在任何单独的函数调用中,相关值可能是0 数字文字,或者可能由leftright 持有。关键是没有变量跟踪这些值的总和。所有的数字都return-ed 给调用者,调用者将它们加一,然后将结果返回给它的调用者,依此类推,无限次,直到耗尽调用堆栈 - 最后返回的值是计算的最终结果。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 2010-12-24
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多