递归函数练习

Recursive Function practice

本文关键字:练习 递归函数      更新时间:2023-10-16

我正在为即将到来的考试学习,学习指南上的一个问题是:

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

我能够将字符串转换为整数,但在函数递归的基本情况下遇到了问题。如有任何建议或帮助,我们将不胜感激。

基本情况是一个空字符串。

递归的每一步都会将字符串中的一个字符转换为整数。递归步骤在字符串的剩余部分中进行。

作为您自己,如何"按照自己的方式"处理起始字符串?

我的直觉告诉我从"1357"开始我会从"7"开始,离开"135",然后是"5",离开"13",以此类推。你最终会留下什么?一个空字符串!

#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+5

不确定您的意思是"边缘情况"还是"基本情况"。

边缘情况应该是不再需要任何递归的情况,因此可以直接计算出来。因此,我认为当"字符串"只有一个数字(return str[0]-'0';)或有零个数字(return 0;)时,可能会出现这种情况。零位数的情况可能更为普遍。

如果这个数字可能不是以10为基数的数字,那么它的"基数"就多一点。

您可能需要先测试数字的基数。对于c++11,十进制文字(以10为基数)、八进制文字(以8为基数)和十六进制文字(底座16)被支撑,例如0x123、-0123、-123。你可以根据cpp_teger_literal进行测试。

如果不使用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");
}

尾递归版

#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;
}

使用迭代器似乎更优雅,并且具有可以将转换函数应用于子字符串的优点。

#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("%dn",str2int(s.begin(),s.end()));
}