【问题标题】:Counting number of grandchildren in a tree [duplicate]计算一棵树上的孙子数量[重复]
【发布时间】:2010-11-08 19:50:25
【问题描述】:

可能重复:
Stop recursion after a certain amount of steps

用这种方法计算一棵树上的孙子数量,而不是曾孙的数量有什么问题?

(child1 是左孩子,child2 是右孩子) 另外,这个方法不应该带任何参数。如果您提供替代解决方案,还请告诉我我当前的解决方案有什么问题..

  public int countGrandChildren() // but not greatGrandChildren
    {
        int count=0;
        int depth=1;
        if (depth<4){
            if (child1!=null){
                count+=child1.countGrandChildren();
                depth++;
                if (depth==3)
                    count++;
            }
            if (child2!=null){
                count+=child2.countGrandChildren();
                depth++;
                if (depth==3)
                    count++;    
            }   
        }
        return count;

    }

【问题讨论】:

  • 请不要创建与您的旧问题基本相同的新问题...
  • 没有人帮我解决另一个问题
  • 上一个问题中给出了所有可能(合理)的答案。再次提出问题不会改变这一事实!

标签: java recursion tree


【解决方案1】:

如果您不向每个递归调用传递深度,这将如何工作?深度在开始时始终为 1,然后您可以增加它。但它永远不会是 == 3。

【讨论】:

  • 为什么要求函数没有参数?作业是这么说的吗?
  • 但是深度正在增加..
  • 我认为您不太了解变量的范围。当您声明一个“int depth”时,它仅对该函数有效,下次您调用 countGrandChildren 时,depth 将再次为 0。
【解决方案2】:

正如your previous question 已经讨论的那样,您没有在连续的递归调用之间传递任何参数,那么它们怎么可能终止呢?

int depth = 1; if (depth &lt; 4) ...永远如此!

解决方案是以下可能性之一的变体:

  • 递归传递depth(或等效)参数
  • 在别处保持计数(坏)
  • 在构造时根据其在树中的位置为类的每个实例分配一个 myDepth 成员变量(如果您需要重新排列树中的项目,这将是一个痛苦)

【讨论】:

  • 但每次我进入更深层次时都会增加深度
  • @prime: depth 在每次调用 countGreatGrandchildren() 时都是本地的,您在函数开始时将其设置为 1。在每次调用中它是一个不同的depth 变量(并且它总是初始化为 1)。
  • @fprime:不,你不是。您将 depth 作为局部变量,因此每次调用该方法时它都会重新初始化为 1。
  • 那么我唯一的选择就是在别处保持计数。我该怎么做?
  • @fprime:正如我在对您之前的问题的评论中所建议的那样,您可以使用例如 static 类的成员变量。 (但正如我也说过的,这不是一个好的解决方案。)
【解决方案3】:

您最好的选择是将深度变量作为函数的参数传递这里是一个更简单的示例,它通过递归调用函数但每次从传递的参数中减去 1 来计算数字的阶乘。

public int calcFactorial(int facnum){
    int res;
    if (facnum==1){
        res=1;
        }
     else {
        res=facnum*calcFactorial(facnum-1);
        }        

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多