Recursividade com subtração

25 respostas Resolvido
lucas0019

Bom dia

Alguém poderia me ajudar nesse exercício, poderia me dá um norte de como resolve-lo em java :

Implemente um método recursivo em Java que faça a subtração de todos os elementos iguais a 2 de um vetor v de tamanho n.

Exemplos:

Entrada: {-2, -2} Saída: 0
Entrada: {2} Saída: -2
Entrada: {3, 9, 2, 2} Saída: -4
Entrada: {3, 2, 3, 4, 2, 2} Saída: -6

25 Respostas

lvbarbosa
static int subtracaoRecursiva(int[] arr, int pos, int result) {
    if (?) return ?; // Caso base
    int next = arr[pos];
    if (arr[pos] == ?) {
        result = ?
    }
    return subtracaoRecursiva(arr, pos + 1, ?);
}

public static void main(String[] args) {
    int[][] examples = new int[][]{
            {-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ó ,?

lvbarbosa
lvbarbosa

https://panda.ime.usp.br/pensepy/static/pensepy/12-Recursao/recursionsimple-ptbr.html

lucas0019
Nesse caso o caso base seria criar um algoritmo de conversão para o numero negativo  e conta-los ?
lvbarbosa

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.

lucas0019

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.

static int somaIterativa(int[] arr) {
    int result = 0;
    for (int pos = 0; pos < arr.length; pos = pos + 1) {
        result += arr[pos];
    }
    return result;
}

static int somaRecursiva(int[] arr, int pos, int result) {
    if (!(pos < arr.length)) return result;
    return somaRecursiva(arr, pos + 1, result + arr[pos]);
}

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)
      break loop
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

public static void main(String[] args) {
            int[] v = {2, 5, 8, 6, 2, 4, 2};

            int separador = condicao(v, 0);
            System.out.println(separador);
        }

        public static int condicao(int[] v, int tamanho) {

            int r = -1;
            if (tamanho < v.length) {

            }
            if (v[tamanho] / 2 != 1) {
                return 0;
            } else {

                return r * v[tamanho];
            }
        }
    }

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)

staroski
Solucao aceita

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.

public class Programa {

    public static void main(String[] args) {
        Programa programa = new Programa();
        programa.executar();
    }

    public void executar() {
        int[] v = new int[] { 2, 5, 8, 6, 2, 4, 2 };
        int resultado = subtrair(v, v.length);
        System.out.println(resultado);
    }

    public int subtrair(int[] vetor, int tamanho) {
        if (tamanho <= 0) {
            return 0;
        }
        int numero = vetor[tamanho - 1];
        if (Math.abs(numero) != 2) {
            numero = 0;
        }
        return subtrair(vetor, tamanho - 1) - numero;
    }
}
lucas0019

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 :call_me_hand:

Criado 15 de setembro de 2019
Ultima resposta 19 de set. de 2019
Respostas 25
Participantes 3