0

我正在上一门在线 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 语句,因为这是一个递归问题。

我能得到一些帮助吗?

4

5 回答 5

2

s.length() == 0您导致无限递归的情况下。一个空字符串有 0 个元音,因此您应该将第 5 行编辑为return 0;要注意的另一件事:您正在将字符串与==. 该运算符用于其他用途。改为使用equals。看看这个,例如:字符串比较。那s.substring(0, 1) == "a"应该成为s.substring(0, 1).equals("a")

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

于 2012-07-04T01:35:24.670 回答
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))));
}
于 2014-08-30T08:05:12.427 回答
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,所以如果有人有任何建议,请告诉我。谢谢。

于 2012-07-05T08:21:55.487 回答
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>
于 2012-07-04T02:06:31.483 回答
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);

}
于 2012-09-27T05:06:25.367 回答