[英]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.