当我使用测试用例find(“ mississippi”,“ sip”)运行代码时,它在下面打印出“ sippi”和“ false”。我对此感到困惑,因为我假设会打印出“ true”。
我尝试在if正文中删除return语句,但收到错误
public static boolean find (String text, String str) //method to find "str" within "text"
{
if (text.substring(0, str.length()).equals(str))
{
System.out.println(text);
return true;
}
else
{
text = text.substring(1);
find(text, str);
System.out.println(text);
return false;
}
}
我希望输出为sippi true,但实际输出为sippi false
答案 0 :(得分:3)
您没有使用对find(...)
的递归调用返回的布尔值,因此,如果第一个false
的求值为if
,则函数当前始终返回false
。在合适的情况下,还需要其他基本情况才能返回false
:
public static boolean find (String text, String str) {
if (text.length() < str.length()) { return false; }
if (text.substring(0, str.length()).equals(str))
{
return true;
}
else
{
text = text.substring(1);
return find(text, str);
}
}
答案 1 :(得分:1)
您递归地进行操作,直到获得“ sip”的匹配项并打印出“ sippi”。然后,最里面的调用返回true。在调用find()之后,将您带入下一个级别,然后在此处再次打印出“ sippi”。然后,此调用返回false。在调用find()之后,将您带入下一个级别,并在那里打印出“ isippi”。然后,此调用返回false ...等等。
我看不到任何显示“ true”或“ false”的东西。
这似乎是对递归的常见误解。人们得到嵌套调用部分,但没有嵌套返回部分。每个返回仅退出当前的调用级别,而不是整个调用堆栈。