我有一个超类和一个子类,如下所示:
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()
,它调用子类中的递归add函数而不是super,即Stree.add()
, 代替Tree.add()
这会导致无限循环。大家看出问题出在哪里了吗?
这是一项家庭作业,因此我无法更改递归函数的名称。我明确要求向递归添加函数添加功能,而不重写任何现有代码,这基本上意味着我必须调用原始代码add()
功能。
编辑:Tree.add()//递归的代码。请注意,我无法修改此代码来获得我寻求的功能。
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;
}
编辑:现在我看到这是预期的行为,我该如何实现以下目标:
- 使用原始递归添加值
add()
- 实施额外功能
没有看到我假设的参数void add(...)
是将某些内容添加到树中的方法,而受保护的递归方法会查找要添加的节点,然后执行添加。
我进一步假设公共非递归方法将树的根作为起始参数传递给递归方法,而递归方法要么传递左子节点要么传递右子节点,直到遇到叶子。因此,调用非递归方法可能会一次又一次地从根开始。
因此我想说,递归和继承的方法不应该调用非递归版本,而应该再次调用自身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)