Opinem: Qual código a seguir é mais claro?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
felipe_fernandes
Thread.start()

Membro desde: 07/09/2010 22:42:41
Mensagens: 33
Offline

Tenho dois métodos que calculam o fatorial de um número. Ambos retornam o mesmo resultado. Mas qual será o mais claro de se entender? O com recursividade ou sem recursividade? Eu achei mais claro o sem recursividade.

public static int fatorial1(int valor){ // Sem recursividade
int num = 1;
for ( ; valor>0; valor--){
num *=valor;
}
return num;
}

public static int fatorial(int valor){ // com recursividade
if (valor==1 || valor==0){
return 1;
} else {
int num = valor;
num *=fatorial(valor-1);
return num;
}
}

This message was edited 1 time. Last update was at 07/02/2012 17:23:26

[Email] [MSN]
Guguuu
JavaGuru

Membro desde: 09/01/2007 15:03:09
Mensagens: 203
Offline

pra que complicar se vc pode simplificar...

se pra vc esta melhor sem e funciona... pra que bater cabeça?


utilize comentarios durante o codigo.. isso sim ajuda a entender melhor. Por que hoje vc olha e sabe o q é... daki 1 ano, caso vc precise denovo, vai ser bem mais dificil entender...
[MSN]
eduardojandre
What is classpath?

Membro desde: 15/01/2008 16:32:47
Mensagens: 9
Offline

Isso é muito subjetivo, varia de pessoa para pessoa, no começo é difícil entender a recursividade e os métodos iterativos podem parecer mais simples, mas com um pouco de prática a recursividade passa a "fluir" melhor... Só que quase sempre (esse caso incluso) o método iterativo tem um desempenho muito superior, as vezes pelas simplicidade do código vale pena usar a recursividade mesmo assim, mas esse não é o caso..
InicianteJavaHenrique
GUJ Ranger
[Avatar]

Membro desde: 16/02/2011 12:20:00
Mensagens: 806
Localização: São Vicente - SP
Offline

Não sou especialista. Mas, na minha opinião e nestes exemplos (me refiro ao seus 2 exemplos e não ao calculo de fatorial em si), ficaria melhor sem recursividade. Aqui tem um exemplo, bem parecido com o seu, porém um pouco mais resumido.

flw

Jogo de Xadrez com I.A feito em Java 2D. - HFS Softwares


Portal de Jogos - Questionário


"Felizes os Tópicos que estavam aqui neste dia: 07/12/2008, neste horário: 22:11:56 e neste local." - Henrique Ferreira da Silva


"O negócio de software é binário, você é 1 ou 0, vivo ou morto." - Filme Ameaça Virtual


"Existem 10 tipos de pessoas no mundo: as que entendem binário e as que não entendem."


"Compartilhar conhecimentos é uma forma de alcançar a imortalidade." - Dalai Lama


"Aquele que pergunta é um tolo por cinco minutos, mas aquele que não pergunta permanece um tolo para sempre." - Provérbio Chinês


"O topo da inteligência é alcançar a humildade." - Textos Judaicos


"Os computadores são incrivelmente rápidos, precisos e burros; Os homens são incrivelmente lentos, imprecisos e brilhantes; Juntos, seus poderes ultrapassam os limites da imaginação." - Albert Einstein



/**
*
* Programador Java
* @author Henrique Ferreira da Silva
* @since Julho/2010
*
*/
saoj
JWizard
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline


Tem problemas que são mais simples via recursividade, outros mais simples via loop.

Se a solucão exigir muitas iteracões, vc não pode usar recursividade porque o stack é limitado.

Entenda bem os dois! Os problemas mais casca-grossa são mais fáceis de resolver via recursividade. Tentar resolve-los vai for é muito mais difícil. Não vale a pena nem comecar...


Sergio A Oliveira Jr. - saoj

ExperiMENTA:

Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org


[Email] [WWW]
discorpio
Virtual Machine Man
[Avatar]
Membro desde: 06/02/2010 18:46:46
Mensagens: 547
Localização: Rio de Janeiro
Offline

Boa noite a todos.

Sempre, eu digo, sempre opte pela simplicidade em qualquer caso.

Se o código sem a recursividade for mais simples e funciona, então é ele que você deve optar, caso contrário a recursividade seria melhor opção se este código fosse o mais simples a ser usado e funcionando, aliás, como já foi dito aqui, a recursividade sempre é bem funcional em casos mais complicados, tornando o mais simples.

Lembre-se, DEUS fez todo este universo através de uma singularidade, onde ele era menor do que a ponta do seu dedo indicador, e fazendo tudo de maneira simples, ou seja, juntou os elementos químicos básicos aqui, ali e acolá, e criou esta imensidão quase que imensurável, e porque não dizer infinito, ou quase infinito universo.

O Senhor é meu Pastor e nada me faltará. (Sl. 23:01)
[MSN]
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

eu acredito que o código com o loop seja mais claro.

além do mais procuro somente usar recursividade quando é mesmo necessário, me parece um código um pouco menos claro que com o loop e gasta mais recursos.

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
drsmachado
GUJ Expert

Membro desde: 25/09/2010 12:54:06
Mensagens: 3986
Localização: Curitiba / São José dos Pinhais - PR
Offline

Nenhum dos dois, o tópico não segue as regras do fórum, está sem a formatação com a tag [code]

Rumo aos 4000
"Os homens de verdade assumem suas responsabilidades e culpas. Esquivar-se e dar desculpas é atitude dos tolos, que preferem não se comprometer".

Lugar de perguntar é no fórum!
Não respondo via MP
Não respondo por Email
Não respondo por IM
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

A recursividade só é clara quando escreve explicitamente a fórmula.

No caso do fatorial, a definição matemática clássica:

Fat N = N * Fat(N-1), se n > 1
1, se n < 2

Então, só ficaria claro assim:


No caso de um fatorial, provavelmente a solução com o loop será mais fácil de entender para a maior parte dos programadores.
Agora, algorítmos de árvore, onde o pensamento recurso é natural, geralmente ficam mais claros da forma recursiva.

This message was edited 1 time. Last update was at 11/02/2012 17:37:06


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team