Logo Hardware.com.br
LP0956
LP0956 Novo Membro Registrado
4 Mensagens 2 Curtidas

Ajuda com recursividade!

#1 Por LP0956 15/09/2014 - 21:27
Galera, é o seguinte. Estou estudando recursiva, e testei meu programa de duas maneiras diferentes e nas duas ele fez o proposto.

O enunciado do exercício é:


Enviar a partir do programa principal o valor 1. Calcular a soma dos 100 primeiros números em uma função recursiva e mostrar o resultado no programa principal.


Fiz ele de duas maneiras, e das duas deu certo.
A primeira:


import javax.swing.JOptionPane;
public class recursividade {
public static void main(String args[]){
int num;
num=1;
JOptionPane.showMessageDialog(null, "O valor da soma dos 100 primeiros número e " +FSOMA(num));
}
static int FSOMA(int valor){
int soma;
if(valor==100){
return 100;
}
else{
soma=valor+FSOMA(valor+1);
return soma;
}
}
}



A segunda:



import javax.swing.JOptionPane;
public class recursividade {
public static void main(String args[]){
int num;
num=1;
JOptionPane.showMessageDialog(null, "O valor da soma dos 100 primeiros número e " +FSOMA(num));
}
static int FSOMA(int valor){
int soma;
if(valor==101){
return 0;
}
else{
soma=valor+FSOMA(valor+1);
return soma;
}
}
}



Minha dúvida é justamente essa: por que dos dois jeitos o programa exibiu o resultado 5050 se um está com a condição

if(valor==100){
return 100;
}


e o outro está com a condição


if(valor==101){
return 0;
}


Não consigo entender a diferença de o que acontece no primeiro exemplo e o que acontece no segundo. Essa parte ficou muito abstrata pra mim. Nem consigo fazer o teste de mesa disso. Portanto uma ajuda de vocês seria extremamente bem-vinda.
TerraSkilll
TerraSkilll Zumbi Moderador
4.1K Mensagens 1.2K Curtidas
#3 Por TerraSkilll
16/09/2014 - 08:09
A segunda versão executa a função recursiva uma vez a mais (a primeira, até 100, a segunda até 101).

Essa segunda, quando ela chega em 5050, soma 0 (return 0).

5050 + 0 = 5050

Por isso dá o mesmo resultado.

Ou seja, é só uma diferença no critério de parada da recursividade.

Se quiser fazer um teste de mesa (com um conjunto reduzido), faça a condição ser 10 (ou mesmo 5), e ajuste a comparação de acordo.

Exemplo:

Modo 1:
[php]static int FSOMA(int valor){
int soma;
if(valor==5){
return 5;
}else{
soma=valor+FSOMA(valor+1);
return soma;
}
}[/php]

Modo 2:
[php]static int FSOMA(int valor){
int soma;
if(valor==6){
return 0;
}else{
soma=valor+FSOMA(valor+1);
return soma;
}
}[/php]

Teste de mesa:

[code=rich]Modo 1:
FSOMA(1) ---> retorna 1 + FSOMA(2)
FSOMA(2) ---> retorna 2 + FSOMA(3)
FSOMA(3) ---> retorna 3 + FSOMA(4)
FSOMA(4) ---> retorna 4 + FSOMA(5)
FSOMA(5) ---> retorna 5

Resultado ---> 1 + 2 + 3 + 4 + 5 = 15

Modo 2:
FSOMA(1) ---> retorna 1 + FSOMA(2)
FSOMA(2) ---> retorna 2 + FSOMA(3)
FSOMA(3) ---> retorna 3 + FSOMA(4)
FSOMA(4) ---> retorna 4 + FSOMA(5)
FSOMA(5) ---> retorna 5 + FSOMA(6)
FSOMA(6) ---> retorna 0

Resultado ---> 1 + 2 + 3 + 4 + 5 + 0 = 15

[/code]
Note que o segundo modo tem uma chamada a mais, mas que não afeta o valor da soma por retornar zero.

Obs: desconsiderei alguns coisas estranhas com esse código, como não seguir algumas convenções do Java ou ter uma sintaxe que poderia ser mais compacta.

Abraços.
...
TerraSkilll
TerraSkilll Zumbi Moderador
4.1K Mensagens 1.2K Curtidas
#5 Por TerraSkilll
18/09/2014 - 07:31
LP0956
Então, mas se nesse exemplo que você deu que vai até 5, por que se eu colocar
return = 0
ele soma 0 no final, mas se eu coloco
return = 5

ele não soma mais 5 ao resultado?

Eu não entendi o que você quis dizer. Está falando do modo 1 ou do modo 2? Altere o código e me mostre.

Se você alterar o modo 1 e colocar zero no lugar do cinco (return 0), a soma vai dar 10.

Se você alterar o modo 2 e colocar cinco no lugar do zero (return 5), a soma vai dar 20.

Faça os testes de mesa, altere os valores e compare os resultados, aí você verá o que está realmente acontecendo.

Edit: Hum... http://www.guj.com.br/28842-ajuda-com-recursividade

Abraço.
...
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal