如何在递归函数中保存值以递增(Javascript)

时间:2018-02-12 05:46:30

标签: javascript recursion

var count = 0;
var NumbOfNodes = function(root){

   if(root.left != null){
       NumbOfNodes(root.left);
   }

   count++;

   if(root.right != null){
       NumbOfNodes(root.right);
   }

   return count;
}

所以我有这个函数来计算树中的节点数。它是一个递归函数。当我计算一个全局变量时,该函数工作并返回一个适当的值。问题是,我想要计算成为函数的一部分。但是如果我在函数内部声明count,它会继续重置,我不会得到函数的正确答案。

那么,有没有办法在递归函数中保留变量的值。这个问题可以帮助我进行许多其他编码实践。

我想要的(图):树 - > NumbOfNodes() - >给我节点的数量。但我不想仅为此制作一个全局变量。

谢谢!

6 个答案:

答案 0 :(得分:3)

只需从递归中返回计数:

var NumbOfNodes = function(root) {
    var count = 0;
    if (root.left != null) {
        count += NumbOfNodes(root.left);
    }

    count++;     // count ourself

    if (root.right != null) {
        count += NumbOfNodes(root.right);
    }

    return count;
}

这里的基本思想是,在递归的每一步,我们从零开始计数。然后我们将该计数添加到左右子树中的节点数,我们添加一个,以计算自己。

答案 1 :(得分:0)

你真的需要一个额外的变量来维持计数吗?

试试这个,

var NumbOfNodes = function(root){
   if(!root){
    return 0;
   }   
   return NumbOfNodes(root.right) + NumbOfNodes(root.left) + 1; 
}

答案 2 :(得分:0)

您可以将count作为参数传递给该函数,如

var NumbOfNodes = function(root, count){
   if(!count) count = 0;

   if(root.left != null){
       NumbOfNodes(root.left, count);
   }

   count++;

   if(root.right != null){
       NumbOfNodes(root.right, count);
   }

   return count;
}

答案 3 :(得分:0)

由于NumOfNodes本身就是一个变量,因此它是一个实例,您可以使用this.count将自身缓存为值

var NumbOfNodes = function(root){
  if (this.count === undefined) {
    this.count = 0;
  }

   if(root.left != null){
       NumbOfNodes(root.left);
   }

   this.count++;

   if(root.right != null){
       NumbOfNodes(root.right);
   }

   return this.count;
}

答案 4 :(得分:0)

为了保留变量的值,您需要递归地传递它。类似的东西:

var NumbOfNodes = numberOfNodes(roots, 0)

function numberOfNodes(root, count){

    if(root.left != null){
        numberOfNodes(root.left, count);
    }

    count++;

    if(root.right != null){
        numberOfNodes(root.right, count);
    }

    return count;
 }

答案 5 :(得分:0)

  

如何在递归函数(Javascript)中保存值以递增

嗯,您不需要保存值来计算节点数。在设计递归函数时,只需考虑基础归纳案例

  • 基本情况 - node为空,返回0
  • 归纳案例 - node 为空,为此节点返回1,加上此节点的left和{{的计数1}} nodes。

我们的right函数差不多写了

countNodes