我有一个超类和一个子类,如下所示:
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.
}
}
这里的问题是,当我从子类中的新add函数调用super.add()时,它将转到Tree.add().在Tree.add()内部.有一个对add()的调用,该调用在子类中而不是在super中调用递归add函数,即Stree.add()而不是Tree.add(),这导致无限循环.你们看到问题出在哪里吗?
这是一项家庭作业,因此我无法更改递归函数的名称.我明确要求在不重写任何现有代码的情况下向递归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(…)是将某些东西添加到树中的方法,而受保护的递归方法会寻找要添加到的节点,然后执行添加.
我进一步假设公共非递归方法将树的根作为开始参数传递给递归方法,而递归方法要么传递左孩子,要么传递右孩子,直到您碰到叶子.因此,调用非递归方法可能会一次又一次地从根开始.
因此,我想说,递归和继承的方法不应调用非递归版本,而应再次调用自身.