2

我有一个任务要编写一个递归函数,该函数以相反的顺序写入正整数的数字。我的问题是该功能无法正确显示相反的内容。我知道在递归调用中显示数字和 / 时我应该使用 % 或 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
4

7 回答 7

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 
    }
}
于 2012-09-04T20:43:47.160 回答
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);
}
于 2012-09-04T20:56:54.940 回答
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);
  }
}
于 2012-09-04T21:03:33.913 回答
0

你也可以这样做:

int reverse(int number,int n) {
if(number > n) {
    cout << number << endl;
    reverse(number-1,n);
}

但是你应该摆脱第一个数字打印两次。

于 2012-09-04T20:45:50.433 回答
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);
}

或者这种方式更优雅一些。

于 2015-12-08T11:11:12.917 回答
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);
于 2021-06-11T23:44:47.487 回答
0

我不确定这是好还是不好。我还在学习递归。

int reverseNumber(int number, int mod) {
    if(number==0) return mod;

    return (mod * pow(10, floor(log10(number))+1)) + reverseNumber(number/10, number%10);
}

int main() {
    int n; cin>>n;
    cout<<reverseNumber(n,0);
}
于 2022-01-19T09:35:12.190 回答