递归函数实践

时间:2015-04-14 04:14:48

标签: c++ c++11 recursion

我正在为即将到来的考试而学习,其中一个关于学习指南的问题是:

编写一个递归C ++函数,用于将一串数字转换为它所代表的整数。对于 例如,“13531”表示整数13531.您的函数应返回整数值。

我能够将字符串转换为整数,但是对于函数递归的基本情况我遇到了麻烦。任何建议或帮助将不胜感激。

7 个答案:

答案 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()));
}