简体   繁体   English

在 C 中使用递归的倒数函数

[英]Reverse Numbers function using recursion in C

The following is a function that is meant to return the reverse of a number using recursion.以下是一个函数,旨在使用递归返回数字的倒数。 However, it only returns the last digit of the number.但是,它只返回数字的最后一位。 I'd like to know why and how to fix it?我想知道为什么以及如何解决它?

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;

      }
}

Thank you!!!谢谢!!!

Here's some working code:这是一些工作代码:

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

The main reason your code couldn't work, other than what I commented above, is that sum isn't preserved within the calls.除了我上面评论的内容之外,您的代码无法工作的主要原因是sum没有保留在调用中。 This is a common problem in making recursive functions.这是制作递归函数的常见问题。

To remedy this, the "base" is calculated each function call, instead of having a fixed value.为了解决这个问题,每次函数调用都会计算“基数”,而不是固定值。 This also a bit better because it allows larger numbers to be passed, instead of ones not bigger than 100 (another limit of the code you've chosen).这也好一点,因为它允许传递更大的数字,而不是不大于100 (您选择的代码的另一个限制)。

Another implementation is to base the base as a second parameter, so that it doesn't have to be recalculated every function call.另一种实现是将基数作为第二个参数,这样就不必在每次函数调用时重新计算它。 This can, however, be easily remedied by a simple macro.但是,这可以通过一个简单的宏轻松解决。 The call may be :电话可能是:

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

But a can be conveniently placed in a macro (or other function call):但是 a 可以方便地放在宏(或其他函数调用)中:

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

This is a little more efficient, but the difference may or may not be important.这会更有效一点,但差异可能重要也可能不重要。

This is the solution.这就是解决方案。

Call below function as reverse (number, 0);调用下面的函数作为reverse (number, 0);

int reverse(long int n, long int rev) {
    if(n == 0)
        return rev; 
    return reverse(n / 10, rev * 10 + n % 10);
}
int rev(int num){
    return num < 10 ? num : (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}

And it's done in one line.它是在一行中完成的。

Hi A small correction Your code returns the first digit(not last digit) of the entered number.您好 一个小的更正您的代码返回输入数字的第一位数字(不是最后一位数字)。 Here is the reason这是原因

You are calculating revNum after returning some value like this在返回这样的值后,您正在计算 revNum

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

hence the second statement has no effect.因此第二个语句无效。

Also revNum is a local variable revNum也是一个局部变量

So every time when you are calling a recursive function new local copies of sum (local variable) and revNum are getting created and initialized with 0 and 100 respectively.因此,每次当您调用递归函数时,都会创建sum (局部变量)和 revNum 的新本地副本,并分别使用 0 和 100 进行初始化。

Your recursive tree looks like this,For example 596 is the number passed to the recursive function.你的递归树看起来像这样,例如596是传递给递归函数的数字。

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

Now rev(5) returns 5(since 5 < 9) back to the caller ie to rev(59) from there to the caller which is in main, resulting the display of the first digit, in this case it is 5.现在 rev(5) 将 5(since 5 < 9) 返回给调用者,即从那里到 rev(59) 到主调用者,结果显示第一个数字,在这种情况下它是 5。

How to fix it?如何解决?

To fix that issue, you have to make them global variables(sum and revNum) also return statement should be at the end, after calculating the reverse number.要解决该问题,您必须在计算反向数后使它们成为全局变量(sum 和 revNum)并且 return 语句应该在最后。 Here is the simple code.这是简单的代码。

I made reverse variable as global to preserve the changes in it, finally I'm returning the same to the caller.我将反向变量设置为全局变量以保留其中的更改,最后我将其返回给调用者。

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

This is a simple beginner question so I think we need to write a simple code to answer it too.这是一个简单的初学者问题,所以我认为我们也需要编写一个简单的代码来回答它。 In this way we don't need to create new variables.这样我们就不需要创建新的变量。

n%10 gives us the last number,first we print the last one and then we call reverse function gain but now with parameter n/10 so we get rid of last number which is already printed. n%10给了我们最后一个数字,首先我们打印最后一个,然后我们调用反向函数增益,但现在使用参数n/10所以我们摆脱了已经打印的最后一个数字。

Code代码

int reverse(int n)
{
        if(n<10)
            printf("%d",n);
        else
        {
            printf("%d",n%10); 
            reverse(n/10);
        }
}

May be this snippet helps:可能是这个片段有帮助:

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

...added later... ……稍后补充……

The recursive variant looks like this (I used two functions to have the desired signature):递归变体看起来像这样(我使用了两个函数来获得所需的签名):

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

I'm sure it can be written shorter/optimized ;-)我相信它可以写得更短/优化;-)

*Jost *约斯特

Here is the recursive solution:这是递归解决方案:

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

Check this recursion version.检查此递归版本。

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

Here is mine这是我的

int reverseTheNumber(int number, int reverseNumber) {

if (number != 0) {
    reverseNumber += number % 10;
    reverseNumber *= 10;
    return reverseTheNumber(number / 10, reverseNumber);
}
else {
    return reverseNumber / 10;
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM