递归以查找字符串

时间:2016-10-16 02:40:40

标签: java recursion

我在这里已经看到了这个问题的解决方案,但人员代码与我的不同。我只是想知道我做错了什么。我对编程非常陌生,并且渴望变得更好。

问题:(字符串中指定字符的出现)编写一个递归方法,使用以下标题查找字符串中指定字符的出现次数:

public static int count(String str, char a)

例如:count("Welcome", 'e')返回2。编写一个测试程序,提示用户输入后跟字符的字符串,并显示字符串中出现的字符数。

我的代码问题:

  

线程中的异常" main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

我的代码:

import java.util.Scanner;
public class Exercise18_10{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter a string");   
        String str = input.next();
        System.out.println("Please enter a character");   
        char car = input.next().charAt(0);
        int x = count ("welcome", 'e');
        System.out.println("The number of character " +car + " in string " +str + "     = "+ x);
    }//main

    public static int count(String str, char a){
        int ct = 0;    
        if(str.length()>0)
            if(str.charAt(0) == a)
                ct ++;
        count(str.substring(1),a);
        return ct;
    }
}

请帮助,我做错了什么?

5 个答案:

答案 0 :(得分:1)

其他答案是正确的;你需要在调用str.substring(1)之前检查字符串的长度。但是,您不需要其他方法来维护ct变量。这是Java 101的适当答案:

import java.util.Scanner;

public class Exercise18_10 {

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("Please enter a word: ");
    String word = input.next();
    System.out.print("Please enter a character: ");
    char c = input.next().charAt(0);
    int count = count(word, c);
    System.out.println(String.format("%d occurrences of %c in '%s'", count, c, word));
  }

  public static int count(String str, char a) {
    if (str.length() == 0) {
      return 0;
    }
    int count = 0;
    if (str.charAt(0) == a) {
      count++;
    }
    return count + count(str.substring(1), a);
  }


}

答案 1 :(得分:0)

我认为索引超出范围错误必须是因为class Org(TimeStampedModel): name = models.CharField(_('Organization name'), max_length=255) # Only one owner, but each User can own more than one org owner = models.ForeignKey('auth.User', related_name='owned_orgs') members = models.ManyToManyField('auth.User', related_name='organization_members') users = models.ManyToManyField(User, related_name='organization_users') def __str__(self): return self.name ,当你遇到你的字符串只有一个字母并且你试图得到没有它的字符串时,这是没有的。

ps:解决之后,你还应该检查你如何添加并保留你的ct变量值......

答案 2 :(得分:0)

关于错误,当您持续substring(1)时会发生什么?你最终会得到一个空字符串,你可以不用它!您的if str.length() > 0无法阻止substring来电。

另一个问题 - 每次调用方法时,ct变量都会重置为0,因为它在本地作用于方法。

可以使ct成为一个静态变量,但是我会解决问题的方法 - 实现另一种方法来维护ct变量参数。

private static int countHelper(String str, char a, int count){
    if (str == null || str.length() <= 0) return count; // End recursion

    if(str.charAt(0) == a)
        count++; // Increment count

    // No need for an else statement, recurse with substring
    return countHelper(str.substring(1), a, count);
}

然后,您的实际方法只委托给另一个

 public static int count(String str, char a) { 
     return countHelper(str, a, 0);
 }

答案 3 :(得分:0)

您需要在count(str.substring(1), a)中写下if{...}。 您的代码中的另一个主要问题是count无法在rescurve中保留,您应该count静态或更改您的代码,如下所示。

public static int count(String str, char a) {
    int ct = 0;
    if (str.length() > 0) {
        if (str.charAt(0) == a)
            ct++;
        ct += count(str.substring(1), a);
    }
    return ct;
}

答案 4 :(得分:0)

public static int count(String str, char a) {
    int ct = 0;    
    if (str.length() > 0) {
        if (str.charAt(0) == a) {
            ct++;
        }
        return ct + count(str.substring(1), a);
    }
    return ct;
}

使用递归函数,总是找出终止条件并从那里退出函数,如果适用,使用默认值。在这种情况下,如果字符串的长度为0,则返回count 0。在另一种情况下(字符串长度大于0)再次调用函数。

此外,您需要将函数的值和计数作为总和返回,以获得函数第一次调用的最终总计数。

相关问题