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.
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… 
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);
}
}