我正在尝试用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;
}
我想编写相同的递归函数,但只有一个参数是数字。 喜欢
int getGreatestDigit(int num){
//code
}
我陷入逻辑困境。怎么做?
答案 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);
}
答案 1 :(得分:3)
static int getGreatestDigit(int num)
{
return num == 0 ? 0 :
Math.Max(num % 10, getGreatestDigit(num / 10));
}
所以基本上,你每次都看一下最不重要的数字,将它与其余数字的最大值进行比较。
答案 2 :(得分: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;
}
}
}
答案 3 :(得分: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
}