2012-09-04 159 views
2

我有一個賦值來編寫遞歸函數,該函數以相反的順序寫入正整數的數字。我的問題是該功能不能正確顯示反轉。我知道我應該使用%或10時顯示數字和//10時,在遞歸調用以及基本情況應該是< 10.這是我的代碼。以相反順序的正整數的遞歸函數數字C++

#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 
+1

很難想象你如何在這裏實現事情。對於初學者來說,你的'n'總是0,總是<10,因此你總是會返回0.即使n是可變的,有時可能大於10,它永遠不會改變,所以你會進入無盡的遞歸。 – mah

回答

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 
    } 
} 
+0

我解釋了你的代碼,所以我可以理解代碼在做什麼,而不是簡單地向他展示代碼,這對他沒有任何幫助,我想 –

0

你也可以這樣做:

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

但你應該擺脫的第一個數字印刷的兩倍。

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

糟糕,我提出了同樣的想法。但是這種方法也適用於消極的情況,保持這個標誌是有道理的。 – ch0kee

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

或者這樣,它會更優雅一些。