4

我被要求写一些东西来确定一个数组是否是另一个更大数组的子集。我决定从一个更简单的问题开始,并编写了一个函数来确定字符数组中是否存在字符。我想出了这段代码:

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是返回的,这是不正确的。

我在这里找不到错误 - 有人可以帮我解决这个问题。

4

4 回答 4

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;
}
于 2012-06-06T12:19:38.783 回答
4

当您递归调用您的方法时,您不会存储其返回值,从而有效地丢失指示符,无论是否找到该字符。您真正想要做的是将结果返回当前调用之上的递归调用。

尝试这个:

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);
    }
}
于 2012-06-06T12:22:03.170 回答
0

改变这个:

if(index<findIn.length)
{
    if(findIn[index] == c)
        result = true;
    else
        return findSequenceRecHelper(findIn,c,index+1);
}
于 2012-06-06T12:18:15.163 回答
0

您没有对递归调用做任何事情。相反,您需要设置它返回的结果,以便您可以递归地返回它,即。result = findSequenceRecHelper(findIn,c,index+1);在您的if声明中。

于 2012-06-06T12:20:24.413 回答