包含for循环返回语句问题的递归方法

时间:2012-12-09 09:40:16

标签: java recursion for-loop return

这是一项家庭作业。作业不是在递归上它是在树结构上。我差不多已经完成了任务,但是我的移动方法让你的树恢复了。树结构由下面的类给出:

package lab12;

import java.io.Serializable;

public class Dog implements Serializable{

    public Dog[] children;
    public String name;

    public Dog(String name)
    {
        this.name = name;
    }

    @Override
    public String toString()
    {
        return name;
    }

} 

我很确定原因是返回null;语句与我的for循环结合使用。 for循环遍历不包含任何子节点的节点,因此返回null。这结束了方法并将null传递给我的程序,这给了我空指针异常。

我无法删除return null语句,否则它将无法编译,即使它将100%使用for循环返回。

public Dog findParent(Dog root, String name)
{
    String top = "Spot";
    if(top.equals(name))
    {
        System.out.println("No further records");
        System.out.println("Goodbye.");
        System.exit(0);
    }
    for(int i = 0; root.children != null && i < root.children.length; i++)
    {
        if(root.children[i].name.equals(name))
        {
            return root;
        }
        else
        {
            return findParent(root.children[i], name);
        }
    }
    return null; //Compiler still requires a return here.
}

我觉得这必须是在非void递归方法中使用for循环的常见问题。有没有办法使编译器满意而又没有额外的返回null语句?

2 个答案:

答案 0 :(得分:3)

您的代码无法运行。因为if和else子句都将返回。这会导致循环只执行索引0.您应该更改您的代码,如下所示:

public Dog findParent(Dog root, String name)
{
    String top = "Spot";
    if(top.equals(name))
    {
        System.out.println("No further records");
        System.out.println("Goodbye.");
        System.exit(0);
    }
    for(int i = 0; root.children != null && i < root.children.length; i++)
    {
        if(root.children[i].name.equals(name))
        {
            return root;
        }
        else
        {
            Dog parent = findParent(root.children[i], name);
            if (parent != null) 
                 return parent;
        }
    }
    return null;
}

现在,您可以看到最后一个“返回null”是必要的。

在大多数情况下,编译器很聪明。如果它给出了警告,你应该考虑代码的错误而不是欺骗编译器以避免警告。

答案 1 :(得分:2)

如果不完全理解这个问题,我认为没有理由“return null”语句永远不会执行。也许你的其他陈述应该是:

return findParent(root.children[i], name);

此返回将确保一旦找到“父”,将返回其值。