Imprimindo conteúdo de uma array recursivamente

Eu estou aprendendo sobre recursividade e em um dos exercícios, falta apenas um detalhe para dar certo, mas não sei como fazer.

Tem o método printArray que realiza o que eu quero fazer só que de forma iterativa.
O que eu preciso é o método recursive, ali no else eu não como fazer o return, para funcionar.

PrintArray.java

[code]package PrintArray;
public class PrintArray {

public void printArray(int array[]){
		System.out.printf("%s", "Elements of Array\n");
	for(int counter = 0; counter < array.length; counter++)
		System.out.printf("%d ", array[counter]);
}//fim do printArray

public int recursive(int array[]){
	try{
		
	if (array.length == 0)
		return -1;
	else
		return array[array.length];
	}//fim do try
	catch(ArrayIndexOutOfBoundsException exception){
		System.err.println("Índice fora dos limites.");
	}
	return 0;
}

public void displayMessage(){
	int array1[] = {1,2,6,3,6};
	
	System.out.println(recursive(array1));
}

}[/code]

E aqui a classe de teste
Teste.java

package PrintArray;

public class Teste {

	public static void main(String[] args) {
		PrintArray array = new PrintArray();
		
		array.displayMessage();
	}

}

Dica: nem sempre é fácil usar a recursividade em Java, porque arrays são estruturas difíceis de usar com recursividade. Se Java fosse orientada a listas, seria mais simples.

package printArray;

public class PrintArray {
	public static void main(String[] args) {
		int[] pi = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2};
		PrintArray p = new PrintArray();
		p.print (pi);
	}

	// Note que quem é recursivo é a função auxiliar, usada por este método.
	public void print (int[] array) {
		print (array, 0);
	}

	// A verdadeira rotina recursiva. 
	private void print (int[] array, int start) {
		if (start >= array.length)
			return;
		else {
			System.out.print (array [start] + " ");
			print (array, start + 1); // aqui a recursividade
		}
	}
}

Complicado…

Poderia citar se tem alguns exemplos de recursividade, em aplicações, ou é usado apenas em exercícios de lógica?
É importante saber usar bem recursividade?

a) O exemplo clássico de recursividade com uso prático é listar diretórios e subdiretórios.

De modo geral, qualquer estrutura em forma de árvore (como diretórios, XML etc.) pode ser listada recursivamente.

b) É um truque que é sempre bom ter na sua cartola, mas não é para ser usado demais. Por exemplo, no caso específico acima (a recursividade para substituir a iteração simples), é melhor usar a iteração. Entretanto, para listar diretórios, recursividade é o modo mais simples e mais direto.

Ok.Valeu

Outro lugar clássico (mas que dificilmente você verá em aplicações comerciais, como esses cadastros bobos em softwares de ERP etc.) é para resolução de problemas complexos, que podem ser resolvidos através da redução a problemas mais simples. Acho que você vai ver alguns exemplos disso mais tarde em seu curso.

Não estou fazendo curso, estou lendo o livro do Deitel.

Acho que encontrei uma forma… que tal essa:

package br.nom.luciano.lima.recursivo;

import java.util.Arrays;

public class PrintRecursivo {

	public static void printArray(int lista[]) {

		System.out.printf("%d ", lista[0]);

		if (lista.length > 1)
			// Com Arrays.copyOfRange() eu faço uma espécie de pop().
			printArray(Arrays.copyOfRange(lista, 1, lista.length));
	}

	public static void main(String[] args) {

		int lista[] = { 1, 2, 6, 3, 6 };

		printArray(lista);
	}
}

Quase perfeito (só levar em conta o caso do array vazio - 0 elementos; sua função imprime arrays se eles tiverem 1 ou mais elementos, o que vai dar pau na recursividade - basta testar.

E não é bem “pop” e sim “CDR” ou “tail” (se você você aprendeu a lidar com listas no Lisp, a “cabeça” (head") de uma lista é chamada CAR e o “rabo” (tail) é chamada CDR.

O pop() é uma referência para a função pop() do Javascript.

Trocando um if por outro se resolve o problema de array vazio… Boa observação do meu bug! :oops: Gostei desse problema, recursividade é legal, mas não é muito usado porque sempre deixa o código mais difícil de entender… :wink:

package br.nom.luciano.lima.recursivo;

import java.util.Arrays;

public class PrintRecursivo {

	public static void printArray(String lista[]) {

		// Testa array vazio.
		if (lista.length > 0) {

			System.out.printf("%s ", lista[0]);

			// Com copyOfRange() eu faço uma espécie de pop().
			printArray(Arrays.copyOfRange(lista, 1, lista.length));
		}
	}

	public static void main(String[] args) {

		String lista[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
				"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
				"W", "X", "Y", "Z" };

		printArray(lista);
	}
}