当前位置: 首页 > 知识库问答 >
问题:

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

羊舌胡非
2023-03-14

这是一个家庭作业。家庭作业不是递归的,而是树结构的。我几乎完成了作业,但是我的递归方法在树上移动时中断了。树结构由下面的类给出:

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;
    }

} 

我很确定原因是返回值为空;语句与我的for循环相结合。for循环在不包含任何子节点的节点上迭代,结果返回null。这将结束该方法,并将null传递回我的程序,该程序将给我null指针异常。

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

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循环的常见问题。有没有一种方法可以让编译器满意,同时又不需要额外的return null语句?

共有2个答案

祁烈
2023-03-14

如果不完全理解这个问题,我认为“return null”语句没有理由永远不执行。也许你应该这样说:

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

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

宦高岑
2023-03-14

你的代码不能工作。因为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”是必要的。

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

 类似资料:
  • 我有一个二维布尔数组“poorSignal”,需要编写一个返回网格的方法,如果数组上的一个点为真,则显示X,如果为假,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“missing return statement”。我也不确定“return”\n在打印阵列时是否可以添加新行。 这是一个赋值问题,所以我不能直接打印它,也不能只打印布尔值——它必须是一个生成网格的方法。

  • 我不得不使用全局变量found来指示在哪里找到了一个和。返回语句始终未定义。 此外,如果在下面的if语句中使用return语句,代码将无法正常工作。 这不是问题的最佳解决方案,但这是我得到的工作版本。 返回语句之间的****,删除时代码工作,否则我要么得到false或未定义。我不明白这部分!为什么删除返回就能解决问题,我认为每个递归调用都必须用返回语句进行。 问题可能是由于多次呼叫造成的吗?我是不

  • 我可以找到类似的问题,但我找不到我对这个特定案例期望的答案。 当我执行这段代码时,我得到一个编译错误,上面写着“缺少返回语句”。但是,据我所知,很明显,for循环中的代码将毫无疑问地执行,因为第一次,x=0。因此,对于这种特殊情况,没有理由不在for循环中执行代码。那么,为什么我们还需要在for循环之外声明一个额外的return语句呢?。

  • if语句 (实际上是if表达式) OCaml有两种if语句: if boolean-condition then expression if boolean-condition then expression else other-expression 不同于传统的语言,if语句是表达式。它们更类似于C类语言中的三元操作符?: 而不是你所熟悉的if语句。 下面是if语句的简单例子: # le

  • 问题内容: 我有一个打开文件的代码,计算中值并将该值写入单独的文件。一些文件可能是空的,因此我编写了以下循环来检查文件是否为空,如果是,请跳过它,增加计数并返回循环。它对找到的第一个空文件执行预期的操作,但对第二个不执行预期的操作。循环在下面 输出如下 第二个问题是,t以某种方式从小数点后一位上升到15位,而最后一位似乎增加了小数位?感谢您提供的所有帮助 编辑 该错误 似乎仅适用于仅使用一行示例的

  • 我正在编写一个递归函数,如下所示: 此函数用于接收员工并查找其管理者。如果找到管理器,则将管理器id推送到数组中($)- 所以我的问题是,如果我不在第6行返回递归调用(这是-