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
packagePrintArray;publicclassPrintArray{publicvoidprintArray(intarray[]){System.out.printf("%s","Elements of Array\n");for(intcounter=0;counter<array.length;counter++)System.out.printf("%d ",array[counter]);}//fim do printArraypublicintrecursive(intarray[]){try{if(array.length==0)return-1;elsereturnarray[array.length];}//fim do trycatch(ArrayIndexOutOfBoundsExceptionexception){System.err.println("Índice fora dos limites.");}return0;}publicvoiddisplayMessage(){intarray1[]={1,2,6,3,6};System.out.println(recursive(array1));}}
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.
packageprintArray;publicclassPrintArray{publicstaticvoidmain(String[]args){int[]pi={3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2};PrintArrayp=newPrintArray();p.print(pi);}// Note que quem é recursivo é a função auxiliar, usada por este método.publicvoidprint(int[]array){print(array,0);}// A verdadeira rotina recursiva. privatevoidprint(int[]array,intstart){if(start>=array.length)return;else{System.out.print(array[start]+" ");print(array,start+1);// aqui a recursividade}}}
R
RafaelViana
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
thingol
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
RafaelViana
Ok.Valeu
T
thingol
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
RafaelViana
Não estou fazendo curso, estou lendo o livro do Deitel.
sr.sucesso
Acho que encontrei uma forma… que tal essa:
packagebr.nom.luciano.lima.recursivo;importjava.util.Arrays;publicclassPrintRecursivo{publicstaticvoidprintArray(intlista[]){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));}publicstaticvoidmain(String[]args){intlista[]={1,2,6,3,6};printArray(lista);}}
T
thingol
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…
packagebr.nom.luciano.lima.recursivo;importjava.util.Arrays;publicclassPrintRecursivo{publicstaticvoidprintArray(Stringlista[]){// 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));}}publicstaticvoidmain(String[]args){Stringlista[]={"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);}}