Imprimindo conteúdo de uma array recursivamente

9 respostas
R

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
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));
	}
}
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();
	}

}

9 Respostas

T

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
		}
	}
}
R

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?

T

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.

R

Ok.Valeu

T

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.

R

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

sr.sucesso

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);
	}
}
T

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.

sr.sucesso

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);
	}
}
Criado 14 de abril de 2008
Ultima resposta 15 de abr. de 2008
Respostas 9
Participantes 3