2015-07-19 2 views
-1

Я новичок в Java и занимаюсь рекурсией. Я нашел этот сайт, и я мог бы действительно использовать помощь, чтобы разрушить это и объяснить, как эта проблема будет решена. Требует ли это, чтобы массив был разделен или его можно было решить по-другому?Рекурсивные упражнения

линии включены до сих пор являются:

public class RecursionUtils extends Object { 
public static final int findMaxRecursively(List<Integer> numbers) { 

    return 0; 

необходим для того, чтобы завершить код следующее:

  1. findMaxRecursively

  2. принимает список числа и находит наибольшее из них с помощью рекурсивных вызовов.

@param номера списка чисел, может быть четным или нечетным номером

@return наибольшим номером в списке.

Подсказка: ваш базовый чехол может быть сравнением двух чисел. Значение возврата также должно измениться.

Любая помощь будет оценена, поэтому я могу лучше понять рекурсию.

+0

Ничто в моих упражнений нот не говорил о раскалывается массив, так что я до сих пор путают. Это единственный способ решить эту проблему? –

+0

Рекурсия в основном разбивает проблему на более мелкие наборы аналогичного типа. Таким образом, в вашем случае это эффективно означает найти максимум в меньшем наборе массива, а затем использовать этот результат, чтобы найти max во всем массиве. – anish

+0

Привет @JohnL, вы правы. Я добавил решение. Пройдите его и посмотрите, поможет ли это. Я могу объяснить больше, если вы этого потребуете. –

ответ

0
import java.util.Arrays; 
import java.util.LinkedList; 
import java.util.List; 

public class RecursionUtils extends Object { 

    public static final int findMaxRecursively(List<Integer> numbers) { 
     if (numbers.size() > 0) {// terminating condition... if there are no 
            // elements remaining in the list then 
            // return 0.. 
      int num1 = numbers.remove(0); // remove the first element of the 
              // list, thus in the process we 
              // truncate the list by one element. 
      int num2 = findMaxRecursively(numbers); // find the max from the 
                // rest of the list.. 

      return num1 > num2 ? num1 : num2; 
     } else 
      return 0; 
    } 

    public static void main(String[] args) { 
     List<Integer> numbers = new LinkedList<>(); 
     numbers.addAll(Arrays 
       .asList(new Integer[] { -1, -2, -3, 0, 6, 5, 3, 2 })); 
     System.out.println("The entered list is :"); 
     System.out.println(numbers); 
     System.out.println("\nThe max element is : " 
       + findMaxRecursively(numbers)); 
    } 
} 
+0

Я ценю ответ. Это, безусловно, помогает мне лучше понять эту концепцию. Спасибо –

+0

Довольно уверен, что 'LinkedList' имеет более высокие накладные расходы для переименования элементов, чем большинство других' List'. Можете изменить это для больших входов. –

+0

@ M.Shaw Я знаю два типа списка ArrayList и LnkedList и думаю, что --- Если нам нужно только добавить или удалить элементы в конце списка, используйте ArrayList. В противном случае, если вы удаляете или добавляете элементы в другом месте списка, мы должны использовать LinkedList, потому что в ArrayList все индексы должны быть обновлены. Если я что-то упустил, дайте мне знать. –

1

Попробуйте это:

private static final int findMaxRecursively(List<Integer> numbers, int index, int max) { 
    return index >= numbers.size() 
     ? max 
     : findMaxRecursively(numbers, index + 1, Math.max(numbers.get(index), max)); 
} 

public static final int findMaxRecursively(List<Integer> numbers) { 
    return findMaxRecursively(numbers, 0, Integer.MIN_VALUE); 
} 

public static void main(String[] args) { 
    List<Integer> numbers = Arrays.asList(1, -1, 2, -2, 3, -3); 
    System.out.printf("Max is %d in %s%n", findMaxRecursively(numbers), numbers); 
} 
Смежные вопросы