Parabéns por pelo esforço, é muito importante tentar fazer os exercicios por si mesmo ao invés de apenas esperar a resposta pronta.
Testei seu código aqui e ele imprimiu coisas estranhas. Digitei o número 5 e a saída foi a seguinte:
Digite um numero: 5
5
000004
00003
0002
001
00
Quando deveria ser:
00005
00004
00003
00002
00001
Ou seja, deveria parar no 1 e depois mostrar a soma, que no caso seria 15, certo?
Tentei fazer umas modificações para ver se conseguia obter esta soma, mas não consegui e decidi fazer minha versão do método diminui
e ficou assim:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Digite um numero: ");
int i = sc.nextInt();
System.out.println("Soma >>> " + diminui(i));
}
private static int diminui(int i) {
/*
* Primeiro você converte o valor de i para String.
* Isso é necessário para sabermos quantos digitos tem o número armazenado nele.
* De acordo com o enunciado, cada número deve ser impresso com 5 digitos.
* Se o número for maior que 9999 não haveria problema pois 10000 já tem as cinco casas decimais.
* O problema é que se i for um número com menos casas, precisamos de um jeito para preencher com zeros
*/
String str = String.valueOf(i);
/*
* Aqui a gente testa pra ver se o tal número (agora convertido para String) tem os cinco digitos.
* Se ele contiver menos de 5 digitos, vamos adicionando "0" ao seu inicio.
* Se o valor for "1" ele só sairá do while quando for igual a "00001"
* Se for "999", só sairá quando for "00999" e assim por diante. O número só sai quando tiver os 5 digitos.
*/
while(str.length() < 5) {
str = "0" + str;
}
/*
* a variável soma é inicializada com o valor de i e não com 0
*/
int soma = i;
/*
* O enunciado parece dizer para imprimirmos o valor de i, mas nós vamos imprimir a vesão
* transformada em String de i
*/
System.out.println(str);
/*
* A recursão deve parar no "00001" e é o que esse if nos assegura
*/
if (i > 1)
/*
* O -- antes do i faz com que o valor de i seja diminuido em uma unidade e este valor é passado para o método diminui
* Se o valor atual de i é 5, nós diminuimos para 4 e passado este novo valor para diminui e assim fazemos até que i seja igual ou menor que 1
*/
soma += diminui(--i);
/*
* Terminamos retornando o resultado de soma
*/
return soma;
}
}
Comentei o máximo que pude para tentar deixar claro o porquê de cada trecho, espero que ajude.
O método diminui
não consegue retornar a menos que o valor passado para ele seja igual ou menor que 1. Imagine que o invocamos passando o valor 5 como argumento.
diminui(5);
Quando chegar na linha:
soma += diminui(--i);
O que estará acontecendo por debaixo dos panos é isso:
soma += diminui(4);
Por sua vez diminui(4)
, internamente estará fazendo isso:
soma += diminui(3);
E assim segue até que i diminua até se tornar 1. Quando isso acontecer e o código chegar nesses trecho:
if ( i > 1 )
O resultado dará false
e finalmente pulará para o return
, que no caso seria 1. No final teriámos algo parecido com isso:
int soma = 5;
/* ... */
soma += diminui(4) + diminui(3) + diminui(2) + diminui(1);
kkk… Tentei explicar o efeito de recursão deste método e espero de todo coração não ter lhe atrapalhado mais ao invés de ajudar, é complicado até pra eu mesmo entender. De qualquer forma análise e tente tirar suas próprias conclusões, coloque println
s em todo lugar para ver o que ele imprime em determinadas partes do código.