当前位置: 首页 > 知识库问答 >
问题:

通过递归方法计算图中的顶点,最后返回一个整数

鲜于仰岳
2023-03-14

我目前正在做一个赋值,在这个赋值中,我需要使用一个数组中顶点相连的图。我需要计算图中的每个节点,并尝试递归地这样做。

public int getAmountOfNodes(Node node, int countFrom){
        for (Node n : node.children) {
            if (n != null) {
                countFrom++;
                getAmountOfNodes(n, countFrom);
            }
        }
        return countFrom;
    }

到目前为止,我一直在尝试这样做,但结果并不像我所希望的那样。我试图调试代码,似乎计数是按预期的方式工作的(计数每个非空节点)。问题似乎是,当递归堆栈结束时,比如countFrom达到了5,并且该方法返回5,堆栈中的下一个递归调用就不会“记住这一点”,而是返回它之前计算过的数量,比如4。这意味着最终返回的整数仅为第一个递归调用计数的数量,即第一个节点的子节点数量。

我一直在尝试谷歌搜索,但没有找到一个我可以使用的答案。我还在学习递归,所以请原谅我面前可能出现的任何愚蠢的错误。

任何帮助都将不胜感激,并将提供所需的任何信息。谢谢

共有3个答案

於永寿
2023-03-14

堆栈中的下一个递归调用不“记住这个”,并返回它以前计算过的数量

因为您没有使用调用返回的值:

getAmountOfNodes(n, countFrom);

每个调用都会创建一个新的递归分支,但返回值不受影响。

还有几个小问题:

  • 您不需要第二个参数,只需返回累计值,而不需要维护冗余参数
public int getAmountOfNodes(Node node) {
    int count = 1; // we sould count THIS node
    for (Node child : node.children) {
        if (child == null) continue;
                
        count += getAmountOfNodes(child);
    }
    return count;
}

衡安晏
2023-03-14

在你的代码中,你只是简单地将计数从原始int传递到每个调用,而不用费心从最后一个调用更新它的值。这就是为什么你最后一次迭代没有得到最终结果,这也解释了为什么在你的例子中你得到4而不是5。

在设计递归方法时,应始终考虑所有的基本情况和递归情况。在本例中,基本情况(结束递归迭代的场景)可能是n==null,而递归步骤(使您朝着目标前进的操作)是count变量的增量及其在递归调用后的更新。

您的代码应该看起来像这样。

public int getAmountOfNodes(Node n, int countFrom){
    
    //Checking whether n actually represents a node or not; if it's not then the number of nodes stays the same
    if (n == null){
        return countFrom;
    }

    //If n represents a node then the numer of nodes must be incremented
    countFrom++;

    //Aplying the previous logic to each children of n
    for (Node child: n.children) {
        //Doesn't matter whether child is null or not; if child is null then countFrom stays the same 
        //otherwise it's incremented according to the number of nodes met by the recursive call
        countFrom = getAmountOfNodes(child, countFrom);
    }

    return countFrom;
}
公西俊能
2023-03-14

您可以使用广度优先搜索,这是在没有递归调用的情况下实现的。如果当前节点的每个子节点n是第一次被访问,则会将其添加到FIFO队列中。检查当前节点的子节点后,将从队列中删除另一个当前节点。

 类似资料:
  • 例1:输入:nums=[3,4,2]输出:6解释:删除4以获得4点,因此3也被删除。然后,删除2个赚取2分。共获得6分。 以下是如何解决它的解释: 算法 我无法理解这里是如何使用和变量的,以及它是如何解决问题语句的。 你能帮我理解这一点吗。

  • 我需要一个递归函数,首先返回最深的项,因为反转数组和推到第一个位置很慢。 我有一个目标: 和一个递归函数: 我需要一个递归函数,它可以返回一个对象父id的数组,这样最后一个父id就位于返回数组的第一位。对于上面的例子,如果我将该对象传入我的函数,它应该返回父对象的id,如下所示:

  • 好的,我必须创建一个递归方法来计算树中的节点,我做到了(变量名是葡萄牙语的,对不起): arvbin是二叉树,esq和dir是对树分支的左右引用。 我以为这会奏效,但由于某种原因,当我尝试运行它时,它返回0。我使用了一些调试,我认为问题在于,当方法完成并返回到原始的非递归方法时,cardinalidade变量被设置为0。我不确定这是否是因为自动装箱会弄乱我的整数并将其转换为int,然后当我调用该方

  • 我试图在Python中提出一种贪婪的算法,该算法在给定某个起始顶点的情况下返回无向图中的顶点。我知道DFS确定是否存在循环,但我正在尝试实际返回形成循环的顶点。我使用邻接矩阵来表示下图: 从图学上讲,这是一个由单个循环组成的无向图。 我当前的思想过程是将起始索引设置为我遇到的第一个<code>1)。然后我会查看行的其余部分,看看是否有另一个<code>1</code>存在,因为这意味着我的当前顶点

  • 我试图解决Leetcode上最长的回文子串。我知道这个问题的解决方案,比如围绕中心展开或动态编程自下而上的方法。出于纯粹的教育目的,我想以自上而下的递归方式解决这个问题。我试图找到类似于这里或这里描述的解决方案。(问题略有不同)。我有这个功能: 它接受搜索的字符串开始和结束位置。返回的元组是最长palindrom的开始和结束。我试图分成以下情况: 如果s[i]==s[j],则调查最长(s,i 1,

  • 本文向大家介绍C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,包括了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: 希望本文所述对大家C++程序设计有所帮助。