简体   繁体   中英

identify prime number using recursive method [java]

the problem is below. main() checks numbers 1-10 by calling isPrime(). I think I have the math right however every number other than 2 comes back as not prime.

I have checked some of the solutions and questions on SO, however, I can't seem to achieve the same results.

original problem:

public class PrimeChecker {
// Returns 0 if value is not prime, 1 if value is prime
   public static int isPrime(int testVal, int divVal) {
      // Base case 1: 0 and 1 are not prime, testVal is not prime

      // Base case 2: testVal only divisible by 1, testVal is prime

      // Recursive Case
         // Check if testVal can be evenly divided by divVal
         // Hint: use the % operator

         // If not, recursive call to isPrime with testVal and (divVal - 1)
      return 0;
   }

   public static void main(String[] args) {
      int primeCheckVal = 0; // Value checked for prime

      // Check primes for values 1 to 10
      for (primeCheckVal = 1; primeCheckVal <= 10; ++primeCheckVal) {
         if (isPrime(primeCheckVal, (primeCheckVal - 1)) == 1) {
            System.out.println(primeCheckVal + " is prime.");
         }
         else {
            System.out.println(primeCheckVal + " is not prime.");
         }
      }
   }
}

My solution so far:

     public class PrimeChecker {
     // Returns 0 if value is not prime, 1 if value is prime
   public static int isPrime(int testVal, int divVal) {
      int resultVal = 0;

      if ((testVal == 0) || (testVal == 1)){
         resultVal = 0;
      }// Base case 1: 0 and 1 are not prime, testVal is not prime

      else if (divVal == 1) {
         resultVal = 1;
      }// Base case 2: testVal only divisible by 1, testVal is prime

      else {
         if((testVal % divVal != 0) && (testVal / divVal == 1)) {
            isPrime(testVal, (divVal-1));
         }
         else {            
             resultVal = 1;

      }
      }
      return resultVal;
       }

      public static void main(String[] args) {
      int primeCheckVal = 0; // Value checked for prime

      // Check primes for values 1 to 10
      for (primeCheckVal = 1; primeCheckVal <= 10; ++primeCheckVal) {
        if (isPrime(primeCheckVal, (primeCheckVal - 1)) == 1) {
            System.out.println(primeCheckVal + " is prime.");
         }
         else {
            System.out.println(primeCheckVal + " is not prime.");
         }
      }
   }
}

Change the if/else block

     if((testVal % divVal != 0) && (testVal / divVal == 1)) {
        isPrime(testVal, (divVal-1));
     }
     else {            
         resultVal = 1;

  }

to

if (testVal % divVal != 0) {
  return isPrime(testVal, (divVal-1));
} else {            
  resultVal = 0;
}

Basically, you've forgotten to return the result of your recursion, so the code carries on to return the wrong thing. If testVal % divVal == 0 , the number is non-prime so you return zero. Also, don't use ints that only take the value of zero or one; use a boolean .

According your question, I think the following code would be easier.


public class PrimeChecker {
// Returns 0 if value is not prime, 1 if value is prime
   public static int isPrime(int testVal, int divVal) {
      // Base case 1: 0 and 1 are not prime, testVal is not prime
      if (testVal <= 1) {
         return 0;
      }
        
      // Base case 2: testVal only divisible by 1, testVal is prime
      if (divVal == 1) {
         return 1;
      }
        
      // Recursive Case
      // Check if testVal can be evenly divided by divVal
      // Hint: use the % operator
      if (testVal % divVal == 0) {
         return 0;
      }
      // If not, recursive call to isPrime with testVal and (divVal - 1)
      return isPrime(testVal, divVal - 1);
   }

   public static void main(String[] args) {
      int primeCheckVal;     // Value checked for prime

      // Check primes for values 1 to 10
      for (primeCheckVal = 1; primeCheckVal <= 10; ++primeCheckVal) {
         if (isPrime(primeCheckVal, (primeCheckVal - 1)) == 1) {
            System.out.println(primeCheckVal + " is prime.");
         }
         else {
            System.out.println(primeCheckVal + " is not prime.");
         }
      }
   }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM