我有一个编写递归函数的赋值,它以相反的顺序写入正整数的数字。我的问题是该功能没有正确显示反向。我知道在递归调用时显示数字和/或10时应该使用%或10以及基本情况应该是< 10.这是我的代码。
#include <iostream>
using namespace std;
int reverse(int,int);
int main()
{
int number;
int n;
cout << " Enter number to reverse." << endl;
cin >> number;
cout << reverse(number % 10,0);
return 0;
}//end main
int reverse(int number,int n)
{
if(n < 10)
{
return n;
}
else
{
return reverse(number/10,n);
}
}// end reverse
答案 0 :(得分:3)
我认为这是你的功能应该是:
void reverse(int number){
if(number == 0) //base/basic case i.e if number is zero the problem is already solved, nothing to do, so simply return
return;
else{
cout << number % 10; // print that last digit, e.g 103%10 == 3
reverse(number/10); //solve the same problem but with smaller number, i.e make the problem smaller by dividing it by 10, initially we had 103, now 10
}
}
答案 1 :(得分:1)
您可以使用以下代码(如果您不介意去除前导零,或者您可以在字符串或ostringstream中累积字符)
unsigned reverse(unsigned n, unsigned acc)
{
if (n == 0)
{
return acc;
}
else
{
return reverse(n / 10, (acc * 10) + (n % 10));
}
}
unsigned reverse(unsigned n)
{
return reverse(n, 0);
}
答案 2 :(得分:1)
此解决方案将省略尾随零,因为它实际上是反转整数的内容:
int reverse(int number, int n = 0)
{
if (number == 0)
{
return n;
}
else
{
int nextdigit = number%10;
int nextprefix = n*10+nextdigit;
return reverse(number/10 ,nextprefix);
}
}
答案 3 :(得分:0)
你也可以这样做:
int reverse(int number,int n) {
if(number > n) {
cout << number << endl;
reverse(number-1,n);
}
但你应该摆脱第一次打印两次。
答案 4 :(得分:0)
int rev(int n) {
if(n<10&&n>-10) return n;
int length=0;
for (int i=n; i; i/=10) length++;
return n%10*(int)pow(10, length-1) + rev(n/10);
}
这是我的解决方案。它只需要一个参数并返回一个int。 另外,不要忘记包括cmath。
int intLength(int i) {
int l=0;
for(;i;i/=10) l++;
return l;
}
int rev(int n) {
return n<10&&n>-10 ? n : n%10*(int)pow(10, intLength(n)-1) + rev(n/10);
}
或者这种方式更优雅。
答案 5 :(得分:0)
构造一个 void 函数来打印是好的,但如果你想让你的函数返回一个反转的整数,你可以试试这个:
int revN(int n,int y=0){
y+=n%10;
if (n<10) return y;
return revN(n/10,10*y);
}
这里 y=0 表示 y 在不作为参数传递时采用默认值 0。例如:需要找到 576 的反转整数。
int x= revN(576);