Qual a utilidade da recursividade?

Eu só queria um bom exemplo para a utilização da recursividade!!!
Pois é muito complexo!!!
Até agora o máximo que consegui fazer com isso foi um programa que calcula o fatorial de 10…
Se alguém tem alguma noção desse troço, me mande uma ajuda aí!!!

Valew!!!

Bom, é muito raro usar recursidade. Geralmente voce nao vai precisar dela. Antes de mais nada, lembre-se: tudo que da para fazer com recursividade é possivel fazer sem ela.

Por ser incomum, é meio complicado achar algum exemplo. Um caso onde usei foi o seguinte:

Tenho uma tabela de cadastro de categorias. Cada categoria tem um id proprio e um id “pai”. Uma categoria de nivel mais alto tem como id pai o numero 0. Cada categoria pode ter ilimitadas subcategorias, que por sua vez podem ter outras categorias e subcategorias.
Entao eu precisava mostrar as categorias em forma de ‘arvore’ ( como a listagem de diretorios na barra da esquerda no windows explorer ). Ou seja:

Categoria 1
    Sub categoria
	Outra sub
	    Sub da sub
			Sub da sub sub
		Mais uma sub
			mais uma
			mais outra
Categoria 2
Categoria 3
	aaaa
	bbbb
	    bbbb1
		bbbb2
Categoria 4
	eeee
		ttttt
			dddd
		ggggg
	oooo

e assim por diante. O algoritmo eh assim: pego todas as categorias com id pai = 0. Assim tenho todas as de nivel mais alto. Entao, em um for(), pego o id de cada categoria “principal” e verifico se existe alguma categoria que tenha como id pai o id da categoria que estou processando no nomento. Se alguma for encontrada, repito o mesmo processo para a nova categoria encontrada. Ou seja, sempre preciso checar se ha mais subniveis e a quem eles estao relacionados.

A parte recursiva eh essa de verificar se existe alguma categoria onde o id pai seja o id da categoria processada no momento. O codigo original eh meio grande, entao vou colocar aqui um pseudo-codigo apenas para exemplificar. Sao 2 metodos: um inicial, que eh a entrada, e outro, que eh o recursivo.

metodo Principal
	* Pegar todos as categorias com id_pai = 0
	* Fazer loop de 0 ate o total de categorias encontradas
	* Pegar o id da categoria atual
	
	* chamar metodo Recursivo passando o id da categoria atual
fim metodo

metodo Recursivo
	* Pegar as categorias com id igual ao id passado como parametro
	* Se encontrar resultados
		* Fazer loop de 0 ate o total de resultados encontrados
		* Pegar o id da categoria atual
		* chamar metodo Recursivo com o id da categoria atual
	* fim Se
fim metodo

Note que dentro do metodo “Recursivo” eu chamo ele mesmo quantas vezes forem necesarias para processas os “n” niveis se subcategorias.

Recursividade, como voce disse, eh meio complicado, e muito pouco usado. Nao se preocupe se nao entender de cara, pois eu tambem nao entendi no inicio :slight_smile:

Rafael

Embora seja difícil VOCÊ ter que implementar a recursividade, ela está muito presento no nosso dia a dia. O bom é que ela já está implementada para você.
A recursividade é bastante utilizada nos algoritmos de ordenação de listas e arrays, árvores entre outros.
Mas como a Collection faz tudo isso pra vc…

Mas o Rafael tem razão. Tudo você pode fazer sem recursividade. Até mesmo os algoritmos mais complexos podem simular a recursividade com pilhas(stack), que inclusive acho melhor, é mais desafiador e poupa recursos da máquina.

Você está fazendo algum curso???
Na universidade agente realmente vê a importância da recursividade. Você provavelmente vai se deparar com ela durante seu curso, caso esteja fazendo algum.

E vamos a um pequeno exemplo.

Eu tenho um pool de conexão. Um pool de conexção é um “array” ou lista com várias conexoes disponiveis. O custo de se criar uma conexão é grande, então o pool cria várias conexões na inicializaçao do programa e depois fica disponibilizando as já criadas.

Exite um método chamado getConnection, que pega o primeiro elemento (conexão) do pool, retira-o de la, adiciona a uma lista de conexões em uso e retorna a referência ao usuário. Só que uma conexão pode ter sido invalidade. Por exemplo ulgum usuário a fechou por engano. Temos então que testar se a conexão está valida.

public Connection getConnection() {
  Connection con = pool.firstElement();

  if (con == null) { //se con == null, o pool está vazio e precisa criar uma nova conexao
    con = new DriverManager.getConnection(...);
    return con;
  } else if (conexaoOk(con)) { //se a coneccao está funcionando, retorne-a
    return con;
  } else {//caso contrário, procure pela proxima conexao disponivel
    return getConnection();
  }
}

escrever a seria de fibonacci em DUAS linhas!

  public int fibonacci (int n) {
    if (n == 1 || n == 2) return 1;
    else return fibonacci(n-1) + fibonacci(n-2);
}

bacaaaaaaaana!

Ae, valew pelos exemplos e pelas lições!!!
Só tenho uma pergunta? Se alguém experiente estiver lendo isso aqui, não exite em responder!!!

Eu to começando agora nessa area, to fazendo um curso de processamento de dados… Já tem 6 meses. Daqui um ano eu o termino e vou para a universidade!
Ai vai a minha pergunta: Eu naum sei qual é melhor pra mim, engenharia ou ciencia da computação? Não sei definir ainda esses dois termos…
Eu quero seguir carreira com programação de jogos, e não sei por qual optar… Tendo em mente que logo apos o curso academico eu vou procurar um pra programação de jogos…

Ae se tem alguem que pode me ajudar nessa resposta fora do contexto apresentado. Sou muito grato!!!

Valew

Engenharia eh mais voltado a hardware, redes… Ciencias eh mais voltado a software, pesquisas.

Rafael
ps: programacao de jogos rulez

Ae, só mais uma questão!!!
Eu to desenvolvendo um programa que é uma espécie de prompt de comando… E eu to querendo criar um esquema que não permita que seja dado dois espaços seguidos, apenas um…

Alguém tem alguma idéia aí? Ae valew pela idéia dos cursos universitários!

Falow!!!

Coloca um verificação…
Quando o cara digitar espaço você espera a próxima letra. Esta não poderá ser um outro espaço.
Se for, você o ignora…

[]s

Caro amigo,

Só mais um pequeno detalhe sobre recursão: se não for usada com coerência pode tornar o programa extremamente lento.

Como dito: tudo o que pode ser criado com recursividade, pode também ser criado sem… e ainda que com mais trabalho, pode ser benéfico o resultado final, pois ganha-se em performance.

Como o nosso amigo Paulo Silveira mandou um exemplo sobre a série de fibonacci, vamos exemplificar. O método recursivo que ele utilizou pode ser substituído pelo código abaixo ( sem recursão ):

[code]public long fibonacci ( long n ) {
long n1, n2, total;

total = 1;
n1 = 0;
n2 = 1;

for ( int i = 2; i <= n; i++ ) {
total = ( n1 + n2 );
n1 = n2;
n2 = total;
}

return total;

}[/code]

Tudo bem, não tem duas linhas - mas experimente calcular o fibonacci para o valor 50 nas duas abordagens… o resultado vai falar por si mesmo… :smiley:

Usando o método recursivo da Série de Fibonacci para 50: 4 minutes 56 seconds
Sem recursão: 0 seconds
:shock: