验证方法 - 使用递归编写Java方法来确定String的元音是否多于辅音

时间:2017-03-04 06:12:39

标签: algorithm

我正在努力解决上述问题。以下是我的解决方案。感谢反馈/意见。

public static boolean areMoreVowels(String str, int c, int v){
    String vowels = "aeiou";

    if(vowels.indexOf(str.charAt(0))>=0){
        v++;
    }else{
        c++;
    }

    if(str.length()==1){
        return v > c;   
    }

    return areMoreVowels(str.substring(1), c, v);

}

public static void main(String[] args) {
    System.out.println(areMoreVowels("aeiouttrrrrr", 0, 0));
}

3 个答案:

答案 0 :(得分:1)

我觉得你的代码还可以!但如果你寻找其他方式,另一个想法可能是

Int areMoreVowels(string str, int pos)
    if  pos == str.length()
        return 0
    k = areMoreVowels(str, pos+1)
    if str[pos] == Vowel()
        return k + 1
    return k - 1

main()
    if areMoreVowels("aeiouttrrrrr", 0) > 0 
        print "Yes"
    else
        print "No"

答案 1 :(得分:1)

就个人而言,为了简单起见,我将其分成两个独立的问题:

  • 计算元音
  • 验证元音的数量是否大于元音的数量

这些方面的东西:

count_vowels(str, p):
    if p == len(str) return 0

    return count_vowels(str, p + 1) + (is_vowel(str[p]) ? 1 : 0)

more_vowels(str):
    return count_vowels(str, 0) > (len(str) / 2)

为每个方法分配一个简单的目的通常是比创建条件结构以将单独的功能压缩到单个方法中更好的方法。

答案 2 :(得分:1)

你的方法很好。我不知道你是否意识到这一点,但你使用tail recursion在某些语言(如Scala)中真正重要,并且可以减少堆栈溢出的可能性。你的方法也已经回复了你的答案,我认为这是一个优势。 您可以考虑减少变量数量:

public static boolean areMoreVowels(String str, int v){
  String vowels = "aeiou"; //do you consider 'y' as a vovel?

  if (vowels.indexOf(str.charAt(0)) >= 0) {
    v++;
  } else {
    v--;
  }

  if (str.length() == 1) {
    return v > 0;
  }

  return areMoreVowels(str.substring(1), v);
}

public static void main(String[] args) {
    System.out.println(areMoreVowels("aeiouttrrrrr", 0, 0));
}