繁体   English   中英

递归查找指定字符在字符串中出现的次数

[英]Recursion to find the number of occurrences of a specified character in a string

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

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

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;
    }
}

请帮助,我做错了什么?

其他答案是正确的; 您需要在调用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);
  }


}

我认为索引超出范围错误一定是因为count(str.substring(1),a); 当您遇到字符串只有一个字母的情况时,您尝试获取没有它的字符串,即没有。

ps:修复后,您还应该检查如何添加和保留 ct 变量的值...

关于错误,当您连续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);
 }

您需要在if{...}写入count(str.substring(1), a) 在你的代码的另一个主要问题是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;
}
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)再次调用您的函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM