得到错误的递归方法输出

时间:2013-04-05 00:37:01

标签: java recursion

    public static int getIndexOf(char ch, String str) {
    if (str == null || str.equals("")) {
        return 0;
     //base case
    }else{
        char first = str.charAt(0);
        if (ch != first) {
            return -1;
     //returns -1 when the character cannot be found within the string
        }else{
            int rest = str.length() - 1;
            if (str.charAt(rest) == ch) {
                return rest; 
            }
            return lastIndexOf(ch, str.substring(0, rest));
            //recursive case
        }
    }
}

这个my方法返回输入字符串的输入字符的索引。但是,当我在交互平面中运行它时,它返回错误的数字。例如,当我输入'a'和“peach”时,它应该返回2,但它返回-1。仅当在字符串中找不到字符时,此方法才应返回-1。谁能告诉我如何处理它? 谢谢!

3 个答案:

答案 0 :(得分:1)

那你为什么不介绍逻辑,看看会发生什么。

getIndexOf('a', "peach")

方法进入,字符串不为空或为空,因此它会进入下一行代码。

char first = str.charAt(0); // this is 'p'

if (ch != first) {  // is 'p' equal to 'a'? no. so return -1
        return -1;

然后你的其余逻辑将永远不会执行。你能看到如何解决这个问题吗?

答案 1 :(得分:0)

您的以下代码部分意味着它将检查字符串的第一个字符是否匹配,否则它将返回-1。

char first = str.charAt(0);
        if (ch != first) {
            return -1;

这表示如果第0个索引处的字符不匹配则发送-1,因此“peach”中的“p”与“a”不匹配,因此返回-1。

你知道了吗?

答案 2 :(得分:0)

输出没有错,执行是!

先用语言思考。如果所需字符是字符串中的第一个字符,则结果为零。否则它是(1 +切断第一个字符后字符串中的索引)。现在编写单词:

return (str.charAt(0) == ch) ? 0 : 1 + getIndexOf(ch, str.substring(1));

这还没有处理字符根本不在字符串中的情况。此处charAt(0)调用最终会抛出IndexOutOfBoundsException,因为str没有!

处理此案例的最简单方法是捕获异常。所以你有两个函数:mustGetIndexOf,它是上面的递归关系,getIndexOf,它在try {} catch() {}内调用上面的函数,在这种情况下返回-1。

当然,如果您不想允许异常,则可以使用if针对-1的特殊情况测试递归调用的结果。代码更加丑陋,但它会起作用。每当看到-1时,再次返回-1。这会将-1一直传播回调用者。异常以类似的方式“展开”堆栈上的递归调用,只需使用一个chop而不是逐句逐个调用方式,if语句将执行此操作。

我不会给你完整的代码,所以你可以继续学习。