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

Я хочу написать такое же рекурсивную функцию, но только с одним параметром, который является номером. Как

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

Чувствует, что кто-то сказал ОП изменить рекурсивное решение хвоста на то, что нет. У него уже было рабочее решение. –

+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; 
    } 
} 
} 
Смежные вопросы