Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归函数练习_C++_C++11_Recursion - Fatal编程技术网

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