使用C++中的递归删除字符串中的所有辅音 对于编程,我几乎是全新的,我尝试学习C++。这是第一个让我感觉自己撞到了墙的任务。我试图搜索,但因为人们通常使用循环来解决问题,所以我什么也找不到

使用C++中的递归删除字符串中的所有辅音 对于编程,我几乎是全新的,我尝试学习C++。这是第一个让我感觉自己撞到了墙的任务。我试图搜索,但因为人们通常使用循环来解决问题,所以我什么也找不到,c++,recursion,C++,Recursion,我试图找到一个递归解决方案来删除字符串中的所有辅音,我想我知道如何使用循环来解决它,但我想扩展我对递归的知识 #include <iostream> #include <string> using namespace std; int i = 0; string s(""); string del_cons(string z){ if(i == (z.length()-1) ){ s+= z.substr(i); return

我试图找到一个递归解决方案来删除字符串中的所有辅音,我想我知道如何使用循环来解决它,但我想扩展我对递归的知识

#include <iostream>
#include <string>

using namespace std;

int i = 0;
string s("");

string del_cons(string z){
    if(i == (z.length()-1) ){
        s+= z.substr(i);
        return s;
    }
    else if(z[i] == 'a' || z[i] == 'e' || z[i] == 'i' || z[i] == 'o' || z[i] == 'u'){
        i++;
        s+= del_cons(z.substr(i));
        return s;
    }
    else{
        s+= z.substr(i,1); 
        i++;
        s+= del_cons(z.substr(i));
        return s;
    }
}


int main(){
    string x;
    getline(cin, x);

    cout << del_cons(x) << endl;

    return 0;
}
Abgebrochen Speicherabzug geschrieben

在处理代码时,这一行似乎是问题所在:

s+= del_cons(z.substr(i));

谁能告诉我我做错了什么?似乎我误用了substr函数,但我不知道如何使用。非常感谢。

对不起,我忍不住。。。C++是一种美丽而强大的语言,如果充分发挥其潜力……
#include <string>
#include <iostream>
#include <algorithm>

int main()
{
    std::string s;
    std::getline( std::cin, s );
    s.erase(
        std::remove_if(
            s.begin(),
            s.end(),
            [](unsigned char x){
                return std::string( "aeiouAEIOU" ).find( x ) == std::string::npos;
            }
        ),
        s.end()
    );
    std::cout << s << std::endl;
}
也无法抗拒

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

using namespace std::literals::string_literals;

std::string del_cons(std::string const & str)
{
    if (!str.size())
        return "";

    if (!std::isalpha(static_cast<unsigned char>(str[0])) ||
        "AEIOUaeiou"s.find(str[0]) != str.npos )
        return str.substr(0, 1) + del_cons(str.substr(1));

    return del_cons(str.substr(1));
}

int main()
{
    std::string input;
    std::getline(std::cin, input);
    std::cout << del_cons(input) << '\n';
}

如果您只是想学习递归并“手工”进行更多操作,那么可能更容易查看字符串中是否仍然存在辅音,可以使用z.find_first_of consonants,其中辅音可能是由所有辅音组成的字符串。如果它返回std::string::npos,则找不到辅音,您可以返回输入字符串停止条件。 否则,你把辅音拿出来,你现在知道它的位置了,也许可以使用z.substr,把辅音前后的子串连接起来。然后使用新字符串递归调用函数

然后,您可以编写一个更通用的函数,该函数接受第二个字符串,其中包含要从字符串中删除的所有字符


此外,使用全局变量作为递归参数不是很好的代码实践,也是代码中最大的缺陷之一。例如,当函数中有两个递归调用时,您会怎么做?。您还需要在函数完成时重置它们,或者您想多次调用它。在本例中,您使用一个字符串调用函数,该字符串必须从一开始就进行处理,但i可能已经递增。您更愿意将i作为一个参数,以指示从哪个字母开始,或者更好地更改函数的结构。当我递归地编写函数时,我经常首先想到停止条件:在哪些情况下,没有什么可以做的,比如空字符串或没有辅音的字符串?然后我想到了在其他情况下应该做什么。

我通过阅读知道开始和结束是存在的,但还没有在我的学习材料上看到它们,这就是为什么我不想使用类似的东西。我真的只是想把我的脑袋绕在递归上说真的,不要抱歉,我已经准备好让人们对这样一个愚蠢的初学者问题感到恼火。你们可能每天都读很多的。@乐天:C++上的很多学习材料都是先教C的,我不是唯一考虑的。我知道我没有帮助你解决你的递归问题,但我觉得你需要一个真正的C++解决方案。现在我们来看看这个全副武装的作战计划的火力language@user4581301:黑暗面更强大吗不,不,不,更快,更容易,更诱人…:-DAs用于解决您的递归问题。。。请注意,您的索引i是全局的,而您的递归调用处理原始输入的子字符串…看起来非常像您将使用纯函数式语言对其进行编程-很好。如果您将部分逻辑分离为bool is_consonantchar c,它可能会更可读一些。@DanielSchepler哦,对不起,我正在为下一年做准备;代码已编辑。
#include <iostream>
#include <string>
#include <cctype>

using namespace std::literals::string_literals;

std::string del_cons(std::string const & str)
{
    if (!str.size())
        return "";

    if (!std::isalpha(static_cast<unsigned char>(str[0])) ||
        "AEIOUaeiou"s.find(str[0]) != str.npos )
        return str.substr(0, 1) + del_cons(str.substr(1));

    return del_cons(str.substr(1));
}

int main()
{
    std::string input;
    std::getline(std::cin, input);
    std::cout << del_cons(input) << '\n';
}