【问题标题】:Find a character recursively in a String在字符串中递归查找字符
【发布时间】:2016-10-02 12:38:12
【问题描述】:

这是弗吉尼亚理工大学 openDSA 交互式学习平台中的一个问题:

对于函数“countChr”,写出递归调用的缺失部分。 此函数应返回字母“A”的次数 出现在字符串“str”中。

int countChr(String str) {
  if (str.length() == 0) {
    return 0;
  }
  int count = 0;
  if (str.substring(0, 1).equals("A")) {
    count = 1;
  }
  return count + <<Missing a Recursive call>>
}

我知道如何通过以下方式非递归查找字符:

 public static void main(String [] args) {
      String str ="abdcfghaasdfaadftaxvvaacvbtradcea";
      int count =0;
      for(int n=0; n<= str.length()-1; n++) {
      if(str.charAt(n)== 'a')
          count++;
      }
      System.out.print(count);
  }

我真的不知道如何递归地做同样的事情,尤其是遵循问题中给出的确切模式。

【问题讨论】:

  • 如果您无法回答这个问题,那么了解什么是递归比获得这个特定问题的答案更有用。
  • 我确信您得到的答案之一是正确的,并且参加测试或测验的人必须按照他们要求的方式回答问题。但这是对递归的难以置信愚蠢的使用 - 这个问题只是构造不佳,这当然不是你的错。
  • @worpet 我“确实”知道如何递归地执行此操作,但我不知道如何完全按照他们的要求执行此操作。我可以按照自己的方式重做整个事情,这很好。它我突然想到我正在上的课程有一个糟糕的讲师,他不遵循设计模式,也不遵循有效的 Java 书中描述的标准。我对这门课感到非常沮丧。这让我觉得自己很愚蠢,并质疑我的可信度。

标签: java string recursion character


【解决方案1】:

您必须在方法内再次调用countChr 方法,String 直到您调用的最后一个字符。所以如果你这样做:

return count + countChr( str.substring(1) );

这会给你想要的结果。

【讨论】:

    【解决方案2】:

    要递归获取字母'A'的出现次数,需要使用从索引1到字符串末尾的子字符串递归调用函数:

    public class Example {
    
        public static void main(String [] args) {
            String str ="abdcfghaasdfaadftaxvvaacvbtradcea";
            System.out.println(countChr(str));
    
            String str2 ="abdcfAhaasdAaadftaxvAAAacvbtradcea";
            System.out.println(countChr(str2));
        }
    
        static int countChr(String str) {
            if (str.length() == 0) {
                return 0;
            }
            int count = 0;
            if (str.substring(0, 1).equals("A")) {
                count = 1;
            }
            return count + countChr(str.substring(1));
        }
    }
    

    输出:

    0
    5
    

    解释这是如何工作的:

    • 首先使用整个字符串调用该函数
    • 如果字符串长度为 0,则返回 0,因为不能出现 'A'
    • 将计数器初始化为 0,用于计算出现次数。
    • 如果字符串的第一个字符是“A”,则增加计数器
    • 现在要重复这个过程,我们需要用相同的字符串调用相同的函数,除了没有第一个字符。我们将此递归调用的结果添加到计数器,然后返回。

    这个过程可以通过添加一些打印来说明:

     int countChr(String str) {
            System.out.println(str);
            if (str.length() == 0) {
                System.out.println("String has length 0, returning 0");
                return 0;
            }
            int count = 0;
            if (str.substring(0, 1).equals("A")) {
                System.out.println("Character is an 'A' adding 1 to the count");
                count = 1;
            }
            return count + countChr(str.substring(1));
    }
    

    输出:

    abdcfAhaasdAaadftaxvAAAacvbtradcea
    bdcfAhaasdAaadftaxvAAAacvbtradcea
    dcfAhaasdAaadftaxvAAAacvbtradcea
    cfAhaasdAaadftaxvAAAacvbtradcea
    fAhaasdAaadftaxvAAAacvbtradcea
    AhaasdAaadftaxvAAAacvbtradcea
    Character is an 'A' adding 1 to the count
    haasdAaadftaxvAAAacvbtradcea
    aasdAaadftaxvAAAacvbtradcea
    asdAaadftaxvAAAacvbtradcea
    sdAaadftaxvAAAacvbtradcea
    dAaadftaxvAAAacvbtradcea
    AaadftaxvAAAacvbtradcea
    Character is an 'A' adding 1 to the count
    aadftaxvAAAacvbtradcea
    adftaxvAAAacvbtradcea
    dftaxvAAAacvbtradcea
    ftaxvAAAacvbtradcea
    taxvAAAacvbtradcea
    axvAAAacvbtradcea
    xvAAAacvbtradcea
    vAAAacvbtradcea
    AAAacvbtradcea
    Character is an 'A' adding 1 to the count
    AAacvbtradcea
    Character is an 'A' adding 1 to the count
    Aacvbtradcea
    Character is an 'A' adding 1 to the count
    acvbtradcea
    cvbtradcea
    vbtradcea
    btradcea
    tradcea
    radcea
    adcea
    dcea
    cea
    ea
    a
    
    String has length 0, returning 0
    

    【讨论】:

    • 感谢您的精彩解释,我接受了它并竖起了大拇指! :)
    【解决方案3】:
    return count + countChr(str.substring(1, str.length()));
    

    或更紧凑的形式:

    return count + countChr(str.substring(1));
    

    【讨论】:

    • 如果您在从该索引到字符串末尾的 substring 方法中只给出一个 int,则子字符串调用中不需要 str.length()
    • 是的,我想通了。感谢您的提示。
    猜你喜欢
    • 2014-05-16
    • 2015-05-13
    • 2014-02-19
    • 2021-09-20
    • 2017-06-13
    • 2021-12-10
    • 2016-01-27
    • 2016-05-20
    • 2019-03-29
    相关资源
    最近更新 更多