使用递归函数计算字符串中的元音

时间:2016-02-15 18:17:11

标签: c++ recursion

我目前是信息系统学士学位的最后一年,主修编程。我接受并通过了C ++编程1.我现在处于C ++编程2中,并且遇到递归函数问题。我们有一个家庭作业,我们假设编写一个程序来计算用户输入的字符串中的元音数量。 我有一个类似于我的C ++编程1类的程序,它使用for循环和if-then语句。我曾经假设将这个工作程序转换为使用递归函数很容易,我错了。 我有代码(不寻找有人为我做这个),我想我已经设置好了。我不确定在函数中调用函数的位置。 有人能指出我正确的方向吗?` 这是我第一次提问。如果我错误地附上了我的代码,请告诉我。

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int vowelCount(string, int, int&);

int mail()
{
string input;
int len;
//int x;
//int y;
int count;

count = 0;

cout << "Enter a string of characters with no spaces: ";
cin >> input;
len = input.length();

vowelCount(input, len, count);

cout << "There were " << count << " vowels." << endl;

system("pause");
return 0;
}

int vowelCount(string input, int len, int& count)
{
int y;
int x;

y = input.at(len);
if (len == 1)
{
    count = count + 1;
    return count;
}
else
{
    y = input.at(len);
    if ((y == 'a') || (y == 'e') || (y == 'i') || (y == 'o') || (y == 'u')         || (y == 'A') || (y == 'E') || (y == 'I') || (y == 'O') || (y == 'U'))
    {
        count = count + 1;
        len = len - 1;
    }
        else
        {
            len = len - 1;
            vowelCount(string input, int len, int& count);
            return count;
        }
    }

}
return 0;
}

2 个答案:

答案 0 :(得分:0)

为了一般性的理解,我建议this问题的答案。

首先,此代码不会运行:它有语法错误。在您拥有至少运行的程序之前,您不应该要求逻辑帮助。您不能使用整个签名调用函数。对于实例,最后一个块应该是一个简单的

return vowelCount(input, len-1)

您将计数作为函数的值返回参数。删除参数。

现在,为了理解递归...请执行以下几个步骤:

  1. 如果字符串为空,则返回0.
  2. 否则,请检查当前的信件:
  3. 2T如果它是元音,则返回1 + {对其余字符串进行计数}

    2F else,return {count on rest of string}

    你的两个递归调用都在括号中。你能从这里拿走吗?

答案 1 :(得分:0)

我会按照以下方式编写函数

#include <iostream>
#include <string>
#include <cstring>
#include <cctype>

std::string::size_type vowelCount( const std::string &input, std::string::size_type pos = 0 )
{
    const char *vowels = "AEIOU";
    return pos >= input.size() 
           ? 0 
           : ( std::strchr( vowels, std::toupper( ( unsigned char )input[pos] ) ) != nullptr ) 
             + vowelCount( input, pos + 1 );
}              


int main()
{
    std::string s;

    std::cin >> s;

    std::cout << "There were " << vowelCount( s ) << " vowels." << std::endl;

    return 0;
}

例如,如果要输入

AaBbCcDdEe

然后输出

There were 4 vowels.

我认为该字符串不包含嵌入的零字符。:) 否则你应该替换条件

( std::strchr( vowels, std::toupper( ( unsigned char )input[pos] ) ) != nullptr ) 

( input[pos] != '\0' && std::strchr( vowels, std::toupper( ( unsigned char )input[pos] ) ) != nullptr ) 

至于你的函数,那么如果要在语法上有效地编写它就没有意义,因为例如这个语句

int vowelCount(string input, int len, int& count)
{
int y;
int x;

y = input.at(len);
^^^^^^^^^^^^^^^^^^

因为根据C ++标准成员函数at

  

5抛出:out_of_range如果pos&gt; = size()。