2015-07-21 41 views
3

我正在嘗試在Java中使用遞歸返回數字中最大的數字。 我已經設法使用兩個參數,數字和更大的數字。 最初越大數字參數接受值爲0如何使用遞歸在數字中查找最大的數字?

static int getGreatestDigit(int num , int greater){ 
    if(num != 0){ 
     if(num %10 > greater){ 
      greater = num%10; 
      num = num/10; 
      return getGreatestDigit(num , greater); 
     }else{ 
      num = num/10; 
      return getGreatestDigit(num , greater); 
     } 
    } 
    return greater; 
} 

我想要寫同一遞歸函數,但只有一個參數是數字。 Like

int getGreatestDigit(int num){ 
//code 
} 

我被困在邏輯。怎麼做?

+0

除非你以某種方式將當前結果存儲在''num''本身,否則你不能這樣做。 –

+0

是的,你可以!您需要檢查當前數字與您在從微不足道情況返回時檢查的其餘數字之間的較大數字。 –

回答

4

只有第一次撥打電話getGreatestDigit(num)需要跟蹤greater結果。對getGreatestDigit(num)的每個遞歸調用將返回其負責掃描的原始數字部分中的最大數字。 getGreatestDigit(num)的第一次調用可以比較它所用的數字和所有遞歸調用返回的最大數字。

int getGreatestDigit(int num) 
{ 
    if (num == 0) return 0; 
    int lastNum = num % 10; 
    int otherDigits = num/10; 
    int recursiveLastNum = getGreatestDigit(otherDigits); 
    return Math.Max(lastNum, recursiveLastNum); 
} 
3
static int getGreatestDigit(int num) 
{ 
    return num == 0 ? 0 : 
     Math.Max(num % 10, getGreatestDigit(num/10)); 
} 

所以基本上,你每次看最低有效數字,將它與其餘數字的最大值進行比較。

+1

這和OP的關鍵區別在於這不是尾遞歸。在Java中,當然沒關係,對於最大大小爲9的任何問題都沒有關係;然而作爲FP範例的一種做法,我更喜歡帶有一個參數的入口函數,調用一個遞歸的兩參數函數。 –

+0

感覺像有人告訴OP將他的尾部遞歸解決方案更改爲不是。他已經有了一個工作解決方案。 –

+0

@EricJ。他只需要他的功能的前端。 –

0
/** Pseudocode: 
1. if num > 9, /10 and call getGreatestDigit on that (recursive step). Then get the current digit (undivided) and return the greater of the two 
2. if num <= 9, return num 
*/ 

int getGreatestDigit(int num){ 
//code 
} 
1

你可以做到這一點,如果你使用的功能堆棧作爲臨時存儲器來保存中間結果,即什麼是以前存儲在greater參數。

這會將您的函數更改爲不再是尾遞歸,從而使性能更差。

int greatestDigit(int num) { 
int last = num % 10; 
int rest = num/10; 
if (rest == 0) { 
    return last; 
} else { 
    int candidate = greatestDigit (rest); 
    if (candidate > last) { 
    return candidate; 
    } else { 
    return last; 
    } 
} 
} 
相關問題