2015-07-21 93 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; 
    } 
} 
}