C++ 递归函数练习
我正在为即将到来的考试而学习,学习指南上的一个问题是:C++ 递归函数练习,c++,c++11,recursion,C++,C++11,Recursion,我正在为即将到来的考试而学习,学习指南上的一个问题是: 编写一个递归C++函数,将一个数字串转换成它所代表的整数。对于 例如,“13531”表示整数13531。函数应该返回整数值 我能够将字符串转换为整数,但在函数递归的基本情况下遇到了问题。任何建议或帮助都将不胜感激。基本情况是空字符串 递归的每一步都将字符串中的一个字符转换为整数。递归步骤将传递到字符串的其余部分。您自己如何“按自己的方式”通过起始字符串 我的直觉告诉我,从“1357”开始,我会从“7”开始,留下“135”,然后是“5”,留下
编写一个递归C++函数,将一个数字串转换成它所代表的整数。对于 例如,“13531”表示整数13531。函数应该返回整数值
我能够将字符串转换为整数,但在函数递归的基本情况下遇到了问题。任何建议或帮助都将不胜感激。基本情况是空字符串 递归的每一步都将字符串中的一个字符转换为整数。递归步骤将传递到字符串的其余部分。您自己如何“按自己的方式”通过起始字符串
我的直觉告诉我,从“1357”开始,我会从“7”开始,留下“135”,然后是“5”,留下“13”,依此类推。你最后还剩下什么?空字符串 不确定“基本情况”是否指“边缘情况” 边情况应该是不再需要任何递归的情况,因此可以直接计算出来。因此,我认为,当“string”只有一个数字(
returnstr[0]-“0”;
)或者有零个数字(return0;
)时,就可能出现这种情况。零位数的情况可能更一般一些
如果数字的“基数”可能不是基数10,请再多了解一点
您可能需要先测试数字的基数。对于c++11,
十进制文字(以10为基数)、八进制文字(以8为基数)和十六进制文字
(基础16)受支持,例如-0x123,-0123,-123。你能行
测试根据
#包括
#包括
#包括
使用名称空间std;
整数转换(字符串x)
{
int c=x[0]-“0”;//获取字符串中第一个字符的数值
如果(x.size()==1)//基本情况
返回c;
//每次返回“x.size()-1”位为零的字符,第一位是数字
返回c*pow(10,x.size()-1)+convert(x.substr(1));
}
int main(){
字符串x;
getline(cin,x);
cout如果不使用pow
,比如:
#include <iostream>
#include <string>
int str_to_int(const std::string& str)
{
if (str.size() == 0)
return 0; // base case, end recursion
else
return (str[str.size() - 1] - '0') +
10 * str_to_int(str.substr(0, str.size() - 1));
}
int main()
{
std::cout << str_to_int("1234");
}
#包括
#包括
int str_到int(const std::string&str)
{
如果(str.size()==0)
返回0;//基本大小写,结束递归
其他的
返回(str[str.size()-1]-“0”)+
10*str_to_int(str.substr(0,str.size()-1));
}
int main()
{
std::cout尾部递归版本
#include<iostream>
#include<string>
void str2int(const std::string& s, int &result, int n = 0)
{
if (n == s.size())
{
return;
}
result *= 10;
result += s[n] - '0';
return str2int(s, result, n + 1);
}
int main()
{
int n = 0;
str2int("1234", n);
std::cout << n;
}
#包括
#包括
void str2int(常量std::string&s,int&result,int n=0)
{
如果(n==s.size())
{
回来
}
结果*=10;
结果+=s[n]-“0”;
返回str2int(s,result,n+1);
}
int main()
{
int n=0;
str2int(“1234”,n);
std::cout使用迭代器似乎更优雅,并且具有转换函数可以应用于子字符串的优点
#include <string>
#include <stdio.h>
using namespace std;
int str2int(string::const_iterator s, string::const_iterator e)
{
if(s==e) return 0;
--e;
return str2int(s,e)*10+*e-'0';
}
int main()
{
string s="12345";
printf("%d\n",str2int(s.begin(),s.end()));
}
#包括
#包括
使用名称空间std;
int str2int(字符串::常量迭代器s,字符串::常量迭代器e)
{
如果(s==e)返回0;
--e;
返回str2int(s,e)*10+*e-'0';
}
int main()
{
字符串s=“12345”;
printf(“%d\n”,str2int(s.begin(),s.end());
}
您想发布答案吗?如果您向我们展示递归案例的样子,我们可以向您展示基本案例的样子。很抱歉,误解了base
所指的内容。处理家庭作业问题的最佳方法。提供想法,而不是代码。:-)这种方法效率极低,因为它在递归过程中会创建大量字符串对象。好的,没有人问效率:-)
#include <string>
#include <stdio.h>
using namespace std;
int str2int(string::const_iterator s, string::const_iterator e)
{
if(s==e) return 0;
--e;
return str2int(s,e)*10+*e-'0';
}
int main()
{
string s="12345";
printf("%d\n",str2int(s.begin(),s.end()));
}