我正在为即将到来的考试而学习,其中一个关于学习指南的问题是:
编写一个递归C ++函数,用于将一串数字转换为它所代表的整数。对于 例如,“13531”表示整数13531.您的函数应返回整数值。
我能够将字符串转换为整数,但是对于函数递归的基本情况我遇到了麻烦。任何建议或帮助将不胜感激。
答案 0 :(得分:2)
基本情况是一个空字符串。
递归的每一步都会将字符串中的一个字符转换为整数。递归步骤传递给字符串的其余部分。
答案 1 :(得分:0)
你自己如何以自己的方式工作"通过起始字符串?
我的直觉告诉我来自" 1357"我会从" 7"开始,然后" 135"然后" 5",离开" 13"等等。你最终还剩下什么?一个空字符串!
答案 2 :(得分:0)
不确定你的意思是'基本情况'的'边缘情况'。
边缘情况应该是不再需要任何递归的情况,因此可以直接解决。因此,我认为“字符串”只有一个数字(return str[0]-'0';
)或零数字(return 0;
)。零数字的情况可能会更为一般。
如果它可能不是10号基数,那么只需要更多关于数字的“基数”。
您可能必须先测试号码的基数。对于c ++ 11, decimal-literal(base 10),octal-literal(base 8)和hex-literal 支持(基数16),例如, -0x123,-0123,-123。你可以做 根据{{3}}进行的测试。
答案 3 :(得分:0)
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int convert(string x)
{
int c=x[0]-'0';//to get the numeric value of the first char in string
if(x.size()==1)//base case
return c;
//in each time return the char with "x.size()-1" digits of zero and the first digit is for the number
return c*pow(10,x.size()-1)+convert(x.substr(1));
}
int main(){
string x;
getline(cin,x);
cout<<convert(x);
}
“12345”将返回为no = 10000 + 2000 + 300 + 40 + 5
答案 4 :(得分:0)
如果没有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");
}
答案 5 :(得分:0)
尾递归版
#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;
}
答案 6 :(得分:0)
使用迭代器似乎更优雅,并且具有可以在子字符串上应用转换函数的优势。
#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()));
}