3

我有一个超类和一个子类,如下所示:

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()从子类中的新 add 函数调用时,它转到Tree.add(). 里面Tree.add()。有一个调用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. 实现额外的功能
4

3 回答 3

2

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

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

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

于 2012-04-27T20:11:17.437 回答
1

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

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

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

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

STree.add(..) 它是额外的东西,调用 super.addCommon(..) 来获取常见的东西,然后 this.add(..) 进行递归。

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

于 2012-04-27T20:04:37.347 回答
0

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

于 2013-03-09T19:19:15.893 回答