【问题标题】:Java inheritance and recursionJava继承和递归
【发布时间】:2019-03-01 22:23:57
【问题描述】:

我有一个超类和一个子类如下:

class Tree{
 ..
 public void add(..){
 //makes a call to protected function add(..) 
 }//for client to use.
 protected TreeNode add(..){}//recursive function which calls itslef
}

class Stree extends Tree{
 //overrides the recursive add function from class Tree
 protected TreeNode add(..){
   ..
   super.add();//calls the non-recursive add function in superclass.
 }
}

这里的问题是,当我从子类中的新添加函数调用super.add() 时,它转到Tree.add()。里面Tree.add()。有一个对add()的调用,它调用子类中的递归添加函数而不是super,即Stree.add(),而不是Tree.add(),这会导致无限循环。各位看出来问题出在哪里了吗?

这是一个家庭作业,因此我无法更改递归函数的名称。明确要求我向递归添加函数添加功能,而不重写任何现有代码,这基本上意味着我将不得不调用原始的 add() 函数。

编辑:Tree.add()//recursive 的代码。请注意,我无法修改此代码以获得我所寻求的功能。

protected StreeNode add(StreeNode node, String value) {
        if (node == null) {
            node = new StreeNode(value);
            numElements++;
        } else if (node.data.compareTo(value) == 0) {
            // do nothing, String was already in Set
        } else if (node.data.compareTo(value) > 0) {
            node.left = add(node.left, value);      // x = change(x)
        } else {
            node.right = add(node.right, value);    // x = change(x)
        }

        return node;
    }

编辑:现在我看到这是预期的行为,我该如何实现以下目标:

  1. 使用原始递归add()添加值
  2. 实现额外功能

【问题讨论】:

  • 更改受保护方法的名称
  • 你为什么要覆盖递归调用?
  • 没问题……这正是它应该做的。 ;)
  • 不幸的是我不能这样做。方法名称需要保持不变。
  • 这是预期的行为..为什么不能更改方法名称?

标签: java inheritance recursion


【解决方案1】:

在没有看到参数的情况下,我假设 void add(...) 是将某些内容添加到树中的方法,而受保护的递归方法会查找要添加到的节点,然后执行添加。

我进一步假设公共非递归方法将树的根作为开始参数传递给递归方法,而递归方法传递左子或右子,直到你碰到叶子。因此,调用非递归方法可能会一次又一次地从根开始。

因此我会说递归和继承的方法不应该调用非递归版本,而应该再次调用自己。

【讨论】:

  • 嘿,虽然你的答案并不是完全正确的解决方案,但它让我觉得我可能在方法调用的某个地方犯了错误,我想我是。谢谢^__^
【解决方案2】:

好的。这是随机的,可能没有多大意义。

在您的 cmets 中,它说您的 Tree.add 是递归的,而 STree.add 是递归的:

创建受保护的方法 Tree.addCommon(..),它不递归,只做需要做的事情。

Tree.add(..) 调用 addCommon(..),然后 this.add(..) 进行递归。

STree.add(..) 做额外的东西,调用 super.addCommon(..) 来做普通的东西,然后 this.add(..) 进行递归。

我知道。应该写伪代码。懒惰。

【讨论】:

  • 感谢您的回复。我编辑了我的帖子。无论如何,我无法修改 Tree 类。我必须使用必须覆盖原始递归添加的 add 函数来做到这一点,尽管我可以在 Stree 类中使用辅助方法。抱歉,如果问题不清楚
【解决方案3】:

如果你不能修改类,也许情况并非如此,但我认为最好的解决方案是创建另一个名为 addHelper(...) 的方法来负责递归,然后你在add(...) 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 2021-05-21
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2015-12-11
    • 2017-12-23
    相关资源
    最近更新 更多