递归素数函数c ++

时间:2017-10-13 13:34:25

标签: c++

我试图理解如何使用递归函数,我不明白为什么这个函数是错误的。我相信它是在基础案例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;
      }
   }
}

1 个答案:

答案 0 :(得分:0)

RecurringJob.AddOrUpdate("name", () => NowAsync(true), (string) null); 始终为真(如果您没有玩无穷无尽或NaN等奇怪的事情),那么可能无法达到预期效果(检查数字是否为只有可被1整除) - 尝试使用素数testVal/1 == testVal和复合7,你就会看到它。

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

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

15

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