Função Recursiva Com Problema, Não Acho o Erro! Uma Ajuda Por Favor

2 respostas
D

Boa noite a todos, estava tentando fazer uma função recursiva para saber se o número é ou não primo, porém em alguns números (9, 15, ...), ao identificar que não é um número primo e executar o ultimo return como false, a função é executada mais uma vez e reatribuída como o return true. Alguém por favor me mostra aonde estou errando, achei outros métodos de como fazer essa verificação, porém fiquei intrigado com esse caso.

package primo;
import java.util.Scanner;

public class Primo {
    
    public static void main(String[] args) {
        Scanner leia = new Scanner(System.in);
        System.out.print("Informe um número: ");
        int num = leia.nextInt();
        boolean resultado = primo(num, 1);
        if(resultado){
            System.out.println(num+" é primo");
        } else {
            System.out.println(num+" não é primo");
        }
   	 
    }
    
	public static boolean primo(int a, int b) {
            b++;
            boolean condicao = true;
            if(a>3){
        	if(a%b==0 && a!=b) {
                    condicao = false;
        	} if(a == b){
                    condicao = true;
                }else if(condicao){  
                    primo(a, b); // <--- função recursiva 
                }     
            }   	 
            return condicao; //<--- sempre que esse return é executado ele volta mais uma vez direto para a função recursiva, que reatribui o valor true em condição           
        }
    
}

2 Respostas

Rodrigo_Sasaki

Isso acontece porque você não está utilizando recursão de cauda.

Vamos supor que você envia 9 e 1 como parâmetros iniciais.
Na primeira chamada ao método você vai cair no terceiro if, que chama primo novamente com 9 e 2, porém seu estado atual nessa chamada écondicao = true; a = 9; b = 2; Quando você chama primo novamente, cai na primeira condição que diz que condicao será false, nessa chamada seu estado é condicao = false; a = 9; b = 3;porém você deixa o código continuar executando, e volta pra primeira execução, onde condicao é true, e retorna. A segunda chamada à função simplesmente se perde. Você pode corrigir isso assim:} else if (condicao) { condicao = primo(a, b); }

D

Obrigado pela ajuda, realmente não tinha percebido isso ^^

Criado 3 de setembro de 2015
Ultima resposta 8 de set. de 2015
Respostas 2
Participantes 2