2014-11-22 32 views
0

我想用java中的递归打印数组,但唯一的参数是数组本身。可能吗?在java中使用递归打印数组

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

是的,只要您可以将当前索引存储为字段即可。不建议这样做 - 将当前索引作为参数传递更加简洁。 – 2014-11-22 11:54:28

+0

你也可以打印第一个元素,创建另一个包含所有其他元素的数组,并用这个“子数组”递归地调用你的方法。这当然是一个愚蠢的解决方案,但要求也是愚蠢的。 – 2014-11-22 12:03:20

+0

@JBNizet我想这也是“我的CPU能力太强了,我该如何在'O(n^2)'?中打印数组”。尽管有趣,但这是解决方案。 – 2014-11-22 12:10:08

回答

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

如果输入。长度== 0这将抛出ArrayIndexOutOfBoundException – macias 2014-11-22 12:05:34

+0

@macias现在可以工作吗? – 2014-11-22 12:07:57

+0

是的,我猜...;) – macias 2014-11-22 12:09:29

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(n)的时间,但有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(n)的复制后跟为O(n)打印仍然会比单个为O(n )操作更有效率。