我被要求写一些能确定数组是否是另一个更大数组的子集的东西。我决定从一个更简单的问题开始,编写一个函数来确定一个字符数组中是否存在一个字符。 我想出了这段代码:
private static boolean findSequenceRecHelper(char [] findIn, char c, int index) {
boolean result = false;
if(index<findIn.length) {
if(findIn[index] == c) {
result = true;
}
else {
findSequenceRecHelper(findIn,c,index+1);
}
}
return result;
}
我做了一些调试,发现函数遍历整个char[]
数组,当数组中的元素等于期望值时,result
变为true
。但是,它再次变为false
并且实际返回false
,这是不正确的。
我在这里找不到错误 - 有人可以帮我解决这个问题。
答案 0 :(得分:5)
在递归步骤中:
else
findSequenceRecHelper(findIn,c,index+1);
您应该return
递归调用返回的值。否则 - 什么也没做,递归调用实际上是多余的。
private static boolean findSequenceRecHelper(char [] findIn, char c, int index)
{
boolean result = false;
if(index<findIn.length)
{
if(findIn[index] == c)
result = true;
else
return findSequenceRecHelper(findIn,c,index+1);
//^
//added return here
}
return result;
}
答案 1 :(得分:4)
当你以递归方式调用你的方法时,你不会存储它的返回值,实际上会丢失指示符,无论是否找到该字符。你真正想要做的是将结果 up 返回到当前的结果之上的递归调用。
试试这个:
private static boolean findSequenceRecHelper(char [] findIn, char c, int index)
{
boolean result = false;
if(index<findIn.length)
{
if(findIn[index] == c)
return true;
else
return findSequenceRecHelper(findIn,c,index+1);
}
}
答案 2 :(得分:0)
改变这个:
if(index<findIn.length)
{
if(findIn[index] == c)
result = true;
else
return findSequenceRecHelper(findIn,c,index+1);
}
答案 3 :(得分:0)
你没有对你的递归电话做任何事情。相反,你将要设置它返回结果的内容,以便你可以递归地返回它,即。 result = findSequenceRecHelper(findIn,c,index+1);
声明中的if
。