递归素数函数 c++

Recursive Prime Number function c++

本文关键字:c++ 函数 递归      更新时间:2023-10-16

我试图了解如何使用递归函数,我不明白为什么这个函数是错误的。我相信它是在基本案例 2 中,但我不知道为什么。

#include <iostream>
using namespace std;
// Returns 0 if value is not prime, 1 if value is prime
int IsPrime(int testVal, int divVal)
{
   // Base case 1: 0 and 1 are not prime, testVal is not prime
   if(testVal == 0 || testVal == 1){
      return 0;
   }
   // Base case 2: testVal only divisible by 1, testVal is prime
   if(testVal/1 == testVal){
      return 1;
   }
   // Recursive Case
      // Check if testVal can be evenly divided by divVal
      // Hint: use the % operator
      if(testVal % divVal != 1){
         IsPrime(testVal, divVal);
         }
      // If not, recursive call to isPrime with testVal and (divVal - 1)
   return 0;
}
int main(){
   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) {
         cout << primeCheckVal << " is prime." << endl;
      }
      else {
         cout << primeCheckVal << " is not prime." << endl;
      }
   }
}

testVal/1 == testVal总是正确的(前提是你没有玩无穷大或 NaN 等奇怪的东西),所以可能不会做你期望的事情(检查数字是否只能被一整除) - 尝试使用素数7和复合15,你会发现它是这样。

因此,传递给函数的零或一以外的任何数字都将被错误地检测为素数。

要查看一个数字是否只能被 1 整除,您需要检查它是否不能被任何其他候选值整除。举例(伪代码):

def isPrime(n):
    testVal = 2
    while testVal * testVal <= n:
        if int (n / testVal) * testVal == n:
            return false
    return true

顺便说一句,我不完全相信测试的素数适合递归解决方案。你可能想看看一个非递归的解决方案(如果你的目标是检测素数)或一个不同的问题(如果你的目标是学习递归)。