簡體   English   中英

在 C 中使用遞歸的倒數函數

[英]Reverse Numbers function using recursion in C

以下是一個函數,旨在使用遞歸返回數字的倒數。 但是,它只返回數字的最后一位。 我想知道為什么以及如何解決它?

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;

      }
}

謝謝!!!

這是一些工作代碼:

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)

這會更有效一點,但差異可能重要也可能不重要。

這就是解決方案。

調用下面的函數作為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);
}

它是在一行中完成的。

您好 一個小的更正您的代碼返回輸入數字的第一位數字(不是最后一位數字)。 這是原因

在返回這樣的值后,您正在計算 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) 到主調用者,結果顯示第一個數字,在這種情況下它是 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;
   }

這是一個簡單的初學者問題,所以我認為我們也需要編寫一個簡單的代碼來回答它。 這樣我們就不需要創建新的變量。

n%10給了我們最后一個數字,首先我們打印最后一個,然后我們調用反向函數增益,但現在使用參數n/10所以我們擺脫了已經打印的最后一個數字。

代碼

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

可能是這個片段有幫助:

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

我相信它可以寫得更短/優化;-)

*約斯特

這是遞歸解決方案:

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

檢查此遞歸版本。

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

這是我的

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