2

以下是一个函数,旨在使用递归返回数字的倒数。但是,它只返回数字的最后一位。我想知道为什么以及如何解决它?

int rev(int number)
{
      int revNum=0, sum=100;

      if(number<=9) return(number);
      else if(number>0) 
      {
           return(rev(number/10)+revNum);
           revNum=(number%10)*sum; sum=sum/10;

      }
}

谢谢!!!

4

8 回答 8

12

这是一些工作代码:

int rev (int number){
    int base = 1;

    while (number / (base * 10)){/*
        * This calculates the base of the number
        * ie number = 435
        *    base   = 100
        */
        base *= 10;
    }

    if (number <= 9){
        return number;
    } else if (number >= 10){ // notice different expression
        int revNum = (number % 10) * base; // this was out of order
        return rev (number / 10) + revNum;
    }
}

除了我上面评论的内容之外,您的代码无法工作的主要原因是它sum没有保留在调用中。这是制作递归函数时的常见问题。

为了解决这个问题,每个函数调用都会计算“基数”,而不是具有固定值。这也更好一些,因为它允许传递更大的数字,而不是不大于100(您选择的代码的另一个限制)的数字。

另一种实现是将基数作为第二个参数,这样就不必在每次函数调用时都重新计算它。但是,这可以通过一个简单的宏轻松解决。电话可能是:

int rev_number (int number, int base){ .. }

但是 a 可以方便地放在宏(或其他函数调用)中:

#define rev(num) rev_number (number, 0)

这更有效一点,但差异可能很重要,也可能不重要。

于 2013-07-18T06:55:40.750 回答
9

这就是解决方案。

调用下面的函数reverse (number, 0);

int reverse(long int n, long int rev) {
    if(n == 0)
        return rev; 
    return reverse(n / 10, rev * 10 + n % 10);
}
于 2014-07-25T11:35:52.213 回答
7
int rev(int num){
    return num < 10 ? num : (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}

它是在一行中完成的。

于 2013-07-18T07:20:10.697 回答
2

嗨,一个小的更正您的代码返回输入号码的第一位(不是最后一位)。这是原因

您在返回一些这样的值后计算 revNum

    return(rev(number/10)+revNum);
    revNum=(number%10)*sum; sum=sum/10;

因此第二个语句无效。

revNum也是一个局部变量

因此,每次调用递归函数时,都会创建sum(局部变量)和 revNum 的新本地副本,并分别使用 0 和 100 进行初始化。

你的递归树看起来像这样,例如596是传递给递归函数的数字。

              rev(596) //call from main
              rev(59)-->rev(5) // these are recursive calles

现在 rev(5) 将 5(since 5 < 9) 返回给调用者,即从那里将 rev(59) 返回给 main 中的调用者,从而显示第一个数字,在本例中为 5。

如何解决?

要解决这个问题,你必须让它们成为全局变量(sum 和 revNum),在计算反向数之后,return 语句也应该在最后。这是简单的代码。

我将反向变量设置为全局变量以保留其中的更改,最后我将其返回给调用者。

    #include <stdio.h>
    int reverse;           //globally declared
    int rev(int revNum)
    {
       if(revNum)
       {
          reverse = (reverse * 10) + (revNum % 10);
          rev(revNum/10);    //recursive call 
       }
       else              
        return;    //return back to caller when revNum becoms 0
    return reverse;          
    }

   int main()
   {
       int num;
       printf("Enter a number:");
       scanf("%d",&num);
       printf("Reverse Number is:%d\n",rev(num));
       return 0;
   }
于 2013-07-18T10:11:16.973 回答
2

这是一个简单的初学者问题,所以我认为我们也需要编写一个简单的代码来回答它。这样我们就不需要创建新的变量了。

n%10给我们最后一个数字,首先我们打印最后一个,然后我们调用反向函数增益,但现在有了参数n/10,所以我们摆脱了已经打印的最后一个数字。

代码

int reverse(int n)
{
        if(n<10)
            printf("%d",n);
        else
        {
            printf("%d",n%10); 
            reverse(n/10);
        }
}
于 2018-02-15T21:25:16.683 回答
1

可能这个片段有帮助:

//init reversed number with last digit of number
reversed_number=number % 10;
//remove the last digit of number
number=number / 10;

//if number has another digit...
while (number > 0)
{
    //...shift left all digits of the reversed_number by one digit
    //    and add the last digit of number
    reversed_number=reversed_number*10+(number % 10);
    //remove the last digit of number
    number=number / 10;
}

...稍后添加...

递归变体看起来像这样(我使用了两个函数来获得所需的签名):

int rev(int number)
{
    return rev_ext(0,number);
}

int rev_ext(int result, int number)
{
    if (number<10)
    {
        return result*10+number;
    }
    else
    {
        result=result*10 + number % 10;
        return rev_ext(result, number / 10);
    }
}

我确信它可以写得更短/优化;-)

*约斯特

于 2013-07-18T06:27:57.280 回答
0

这是递归解决方案:

#include <stdio.h>
#include <string.h>

main()
{
   int pow(int a, int b){
        int p = 1;
        while(b){
            p = p * a;
            b--;
        }
        return p;
    }

    int len(int number) {
        int i = 0;
        while (number) {
            number/=10;
            i++;
        }
        return i;
    }

    int rev(int number) {
        int revNum=0;
        int i = len(number) - 1;

        if(number<=9) {
            return number;
        } else {
            return(number%(10)*pow(10,i) +rev(number/10));
        }
    }
    printf("%d",rev(1234));
}
于 2013-07-18T06:39:10.590 回答
0

检查此递归版本。

#include <stdio.h>  
#include<math.h>
int main()                                                  
{
  int n=345;
  printf("%d",rev(n));
}
int len(int number) 
{
  int i;
  for(i=0;number>0;number=number/10,i++);
  return i;
}
int rev(int n)
{
   if (n==0) return 0;
   int val=0;
   val=n%10;
   return (val * pow(10,len(n)-1)+rev(n/10));
}
于 2013-07-18T07:30:27.200 回答