2014-11-22 2 views
0

Я хочу напечатать массив с recurse в java, но единственным параметром является сам массив. Является ли это возможным?Печать массива с recurse в java

public static void printintArr(int[] a) 
+0

Да, если вы можете сохранить текущий индекс как поле. Это не рекомендуется, потому что передача текущего индекса в качестве параметра намного опрятно. –

+0

Вы также можете распечатать первый элемент, создать другой массив, содержащий все остальные элементы, и вызывать рекурсивно ваш метод с помощью этого «подматрица». Это, конечно, глупое решение, но требование тоже глупо. –

+0

@JBNizet Я полагаю, что это также было бы ответом на «У меня слишком много мощности процессора, как мне печатать массив в« O (n^2) »?». Хотя, как ни странно, это _is_ решение для cons-list. –

ответ

1

Это возможно. Это один из способов сделать это:

public static void print(int[] array) { 
    if (array == null || array.length == 0) { 
     return; 
    } else { 
     System.out.println(array[0]); 
     int[] next = new int[array.length - 1]; 
     System.arraycopy(array, 1, next, 0, array.length - 1); 
     print(next); 
    } 
} 
0

С конца:

void printer(int[] input){ 
    if(input.length > 0){ 
     System.out.println(input[input.length-1]); 
     printer(Arrays.copyOf(input, input.length-1)); 
    } 
} 

От начала:

void printer(int[] input){ 
    if(input.length > 0){ 
     System.out.println(input[0]); 
     printer(Arrays.copyOfRange(input, 1, input.length)); 
    } 
} 
+0

Если вход.length == 0 это выкинет ArrayIndexOutOfBoundException – macias

+0

@macias теперь будет работать? –

+0

yep, я думаю ...;) – macias

1
public static void main(String[] args) { 
    int[] array = new int[] {1, 2, 3, 4, 5}; 
    printArr(array); 
} 

public static void printArr(int[] a) { 
    if (a != null && a.length > 0) { 
     System.out.println(a[0]); 
     // Call the function printArr with the full array, without the first element 
     printArr(Arrays.copyOfRange(a, 1, a.length)); 
    } 
} 

Вы должны импортировать java.util.Arrays

Выход:

1 
2 
3 
4 
5 
0

Другие решения, которые здесь используются до сих пор, требуют многократного копирования всего массива за один раз. Это исключительно медленно. Они работают в O (n) время.

Существует способ сделать это в O (п) времени, но с List:

public void print(final List<?> list) { 
    if (list.isEmpty()) { 
     return; 
    } 
    System.out.println(list.get(0)); 
    print(list.subList(1, list.size())); 
} 

Поскольку subList является вида и не копии, этот метод будет работать в O (n) время, как и следовало ожидать. К сожалению, занимает List, а не массив.

К счастью, есть очень простой способ, чтобы получить Object массив в List:

final String[] data = {"a", "b", "c", "d"}; 
List<String> list = Arrays.asList(data); 

Это не копирует массив, он просто возвращает представление массива в качестве List. К сожалению, это не работает для примитивных массивов. Для этого вам нужно сделать что-то вроде:

final int[] data = {1, 2, 3, 4}; 
Arrays.stream(data).boxed().collect(toList()); 

Для чего требуется копия.

Я хотел бы отметить, хотя, что О (п) копия с последующей О (п) печать по-прежнему будет гораздо более эффективным, чем один O (п) операции.

Смежные вопросы