递归素数函数 c++
Recursive Prime Number function 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;
}
}
}
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
顺便说一句,我不完全相信测试的素数适合递归解决方案。你可能想看看一个非递归的解决方案(如果你的目标是检测素数)或一个不同的问题(如果你的目标是学习递归)。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗