staticintsubtracaoRecursiva(int[]arr,intpos,intresult){if(?)return?;// Caso baseintnext=arr[pos];if(arr[pos]==?){result=?}returnsubtracaoRecursiva(arr,pos+1,?);}publicstaticvoidmain(String[]args){int[][]examples=newint[][]{{-2,-2},{2},{3,9,2,2},{3,2,3,4,2,2}};for(int[]example:examples){System.out.println(Arrays.toString(example)+" -> "+subtracaoRecursiva(example,0,0));}}
Ta aí a estrutura básica, agora só falta preencher as interrogações. Pra preencher tem que saber o que é o caso base e como reduzir o problema em cada iteração da recursão.
lucas0019
Muito obrigado , esses caso base o que seria ele , tipo porquê sou iniciante em java , eu tenho conhecimento em javascript só ,?
Não. Os casos base de uma recursão são as condições que fazem a recursão parar.
O que faz a recursão parar no seu caso?
lucas0019
Assim ,aqui no exercício, eu estou tentando colocar de forma que o usuário insira os números e o algorismo realiza a subtração de todos os elementos iguais a 2 de um vetor v de tamanho n.
Respondendo sua pergunta : Acho que eu usaria o break;
lvbarbosa
Não cara. Pensa na solução do problema, ignora como o dado chega pra função, isso não interessa.
O que faz a sua função de recursão parar? Se você não souber responder isso (tudo bem não saber), tem que voltar e estudar recursão mais um pouco. Não adianta tentar resolver os problemas sem ter entendido os conceitos.
lucas0019
Assim , to tendo essa matéria na faculdade , e na segunda aula o professor passou esse exercício , eu consegui fazer dois o de Finaboci e de Fatorial , mas esse exercício eu realmente não estou entendendo
Poque a principio meche mais com desenvolvimento web , acho que estou confundindo algumas coisa
lvbarbosa
A função recursiva que o exercício está pedindo independe de como o dado chega pra ela, entendeu? Ela recebe um array, a posição atual no array e o resultado, faz a conta e retorna. Os parâmetros podem ter vindo de um arquivo, de um socket, do terminal, etc. A fonte do dado é só um detalhe que você não precisa se preocupar.
Nesse caso, é exatamente a mesma coisa de um for, só que ao invés de deixar a linguagem fazer o laço automaticamente, é você que está no controle.
Como seria a solução usando for? O for tem uma condição de parada, e é a mesma ideia pra fazer a recursão parar.
lucas00191 like
Assim ?
for (int i = 0; i <= n; i++)
lvbarbosa
Olha aqui pra ajudar a entender. As duas funções fazem exatamente a mesma coisa. Uma usando recursão e outra usando um laço de repetição.
Os dois casos tem exatamente as mesmas ideias: quando alguma coisa acontece (e é esse “alguma coisa” que eu quero que você entenda), para tudo e retorna o resultado. O que é o “alguma coisa” nesse caso? O que faz o loop terminar? O que faz a recursão terminar? A resposta pras 3 perguntas é a mesma.
lucas0019
Eu poderia usar um sintaxe assim, em que eu dou uma condição e depois paro ela , ou seja ela vai rodar até certo ponto depois parar
if(condicao)breakloop
lvbarbosa
Sim, exatamente. Por isso tem um if no começo do código. O que você precisa é preencher a condição de parada desse problema. Qual é ela? E quando ela acontece, o que é que você retorna?
lvbarbosa
Um detalhe que pode ajudar: Se você não colocar a condição de parada, a função entra em loop infinito.
lucas0019
Posso utilizar esses valores de parada
os operadores
!===
lucas0019
** Antes de qualquer coisa , quero agradecer por dispor do seu tempo para me ajudar*
lucas0019
Sei que é errado da minha parte , mas você poderia me da a solução para eu poder analisar e entender o que aconteceu , por gentileza , pq agr vou para o meu curso de Banco de Dados Online ,
lucas0019
Man eu tentei aqui e nada , realmente não sei por onde começar
lucas0019
Boa Noite , se alguém poder me ajudar
Fiz dessa forma o exercício de subtração na recursividade
o Problema que ele não está somando os (- 2 ), nesse caso o resultado teria que dar (-4)
staroski
Onde está a recursividade?
O que esse método condicao está fazendo?
Não entendi sua lógica:
se o tamanho informado for menor que o tamanho do vetor v, não faz nada
se a divisão por 2 do elemento na posição tamanho for diferente de 1 então o método retorna 0
senão retorna o elemento na posição tamanho multiplicado por -1
Você chegou a fazer um teste de mesa desse seu algoritmo?
lucas0019
Sim , ele imprime somente os numero que quero , que é - 2
lucas0019
Mas nesse caso ele deveria trazer ele somado que seria (-4)
Solucao aceita
staroski1 like
Mas o primeiroif é completamente desnecessário, pois ele não faz nada.
Por que somado?
Seu enunciado pede uma subtração, não soma.
O que você está fazendo é só inverter o sinal do número (multiplicando por -1)
Mas o que você deveria fazer é subtrair os números 2
Seu código só está passando pelo Primeiro elemento pois você não está usando recursividade.
Obrigado , agr eu entendi como funciona esse método . quando eu falei em soma ,por exemplo quis dizer se eu tenho o numero [[telefone removido]] ele irá trazer somando e negativo os 2 , ai ele imprime o -8, obg , agr vou continuar estudando aqui