使用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';
}