Java Vowel计数器使用递归

时间:2012-07-04 01:34:01

标签: java recursion counter

我正在进行在线CPS课程,而且我需要编写一个代码来计算字符串中的元音(大写和小写)。这是我的代码:

    public static int countVowels( String s )
    {
        {
        if ( s.length() == 0 )
          return 0 + countVowels(s);
        else if ( (s.substring(0, 1) == "a" ) || (s.substring(0, 1) == "A") ) 
          return 1 + countVowels(s.substring(1));
        else if ( (s.substring(0, 1) == "e" ) || (s.substring(0, 1) == "E") ) 
          return 1 + countVowels(s.substring(1));
        else if ( (s.substring(0, 1) == "i" ) || (s.substring(0, 1) == "I") ) 
          return 1 + countVowels(s.substring(1));
        else if ( (s.substring(0, 1) == "o" ) || (s.substring(0, 1) == "O") ) 
          return 1 + countVowels(s.substring(1));
        else if ( (s.substring(0, 1) == "u" ) || (s.substring(0, 1) == "U") ) 
          return 1 + countVowels(s.substring(1));
        }

        return countVowels(s.substring(1));
    }

但是我收到了“StackOverFlow”错误,我不知道该怎么做。我知道错误意味着没有达到终止条件。我不允许使用任何我尚未学习的内容,也不允许使用for或while语句,因为这是一个递归问题。

我能帮忙吗?

5 个答案:

答案 0 :(得分:2)

s.length() == 0导致无限递归的情况下。空字符串有0个元音,因此您应该编辑第5行到return 0;另外需要注意的是:您要将字符串与==进行比较。此运算符用于其他操作。请改用equals。看看这个,例如:String comparison。那就是s.substring(0, 1) == "a"应该成为s.substring(0, 1).equals("a")

事实上,我会给你一些其他的建议,比如只是在字符串中存储第一个字母,而不是在每种情况下计算它(两次)。此外,您可以获得第一个字符的小写字符,这样您就可以减少两次比较的情况。另外,将元音添加到数组中,此代码不是DRY。

答案 1 :(得分:0)

这是javascript中可能的解决方案。您可以通过创建文件'something.html'并在浏览器中打开它来测试它。

<html>
<head></head>
<body>
<div id="input">
</div>
<div id='answer'> 
</div>
<script>
var vowels = ['a','e','i','o','u'];
var testInput = 'Hello this is just a test. Out with it.';

function Contains(value, inArray) {
    var found = false;  
    for(var j=0, size = inArray.length; j < size; j++) {
        if(value.toLowerCase() === inArray[j]) {
        found = true;
        }
    }
    return found;
}

var vowelCounter = 0;
    for(var i=0, j = testInput.length; i < j; i++) {
        if(Contains(testInput[i], vowels)) {
        vowelCounter +=1;
        }
    }

    var inp = document.getElementById("input");
    inp.innerHTML = 'Question <br/>' + testInput;

    document.getElementById('answer').innerHTML = 'Number of Vowels: ' + vowelCounter;

</script>
 </body>
</html>

答案 2 :(得分:0)

我希望到现在你已经完成了你的作业。我用更短的方式解决了同样的问题:

public class CountVowels {
    private static String vowels = "aeiou";
    public static void main(String[] args){
        String s = "RohanAskedAQuestion";
        System.out.println(recursivelyCountVowels(s));
    }

    private static int recursivelyCountVowels(String s) {
        if(s==null||s.length()==0)
        {
            return 0;
        }
        if(vowels.contains((CharSequence) s.substring(0, 1).toLowerCase())){
            return 1+recursivelyCountVowels(s.substring(1));
        }
        return 0+recursivelyCountVowels(s.substring(1));
    }
}

我希望它有帮助:),我也在学习java所以如果有人有任何建议请告诉我。 感谢。

答案 3 :(得分:0)

也许它有点迟了但仍然:)

public int recursiveCountVowels(String str,int count,int currentPosition)
{
    str = str.toLowerCase();
    if(str.trim().length() == 0)
        return count;

    if(currentPosition == str.length())
        return count;

    for(int i = currentPosition ; i < str.length();i++)
    {
        if(str.charAt(i) == 'a' || str.charAt(i) == 'e' || str.charAt(i) == 'i' || str.charAt(i) == 'o' || str.charAt(i) == 'u')
            count++;
            currentPosition++;
    }

    return recursiveCountVowels(str, count, currentPosition);

}

答案 4 :(得分:0)

元音数(vc) - 返回输入字符串中元音的数量。

public static int vc(String s)
{
    if(s.length() - 1 < 0) return 0;
    return((("aeiou".indexOf((s.charAt(s.length()-1)+"").toLowerCase()) >= 0 ? 1 : 0)) 
           + vc((s = s.substring(0,s.length()-1))));
}