我目前正在编写一个使用递归来查看数字是否为素数的函数,这是我到目前为止所拥有的:
我的宣言是
bool isPrime(int num, int divisor = 2);
bool isPrime(int num, int divisor){
if (num == 1){
return true;
}
else{
if (num%divisor == 0){
return false;
}
else{
if (divisor == num){
return false;
}
return isPrime(num, divisor++);
}
}
}
我是C ++的新手,所以我不确定你是如何将参数设置为以某个数字开头的。但是当我运行这个功能时,视觉工作室就崩溃了。有什么想法吗?
答案 0 :(得分:0)
您已经更新了问题,让我建议您使用更清晰的代码版本,您不需要这么多嵌套循环。
我的修改在评论中有所描述。对于第二个问题,请see here。
bool isPrime(int num, int divisor)
{
if (num == 1)
{
return true;
}
else if (num%divisor == 0)
{
return true; // <- if we are here the number is prime
}
else if (divisor == num)
{
return false;
}
return isPrime(num, ++divisor); // <- you want to augment divisor BEFORE giving it to the function
}
此外,通话不应该是bool isPrime(int num, int divisor = 2);
,而是
bool result = isPrime(num, 2);
这是最初发布的问题的答案:
你的问题在这里:
(num%divisor == 0) && (divisor == num)
你不需要
(divisor == num)
你已经
了while (divisor != num)
答案 1 :(得分:0)
代码中有不必要的行。例如,您有一个while循环,它将在第一次迭代时始终到达return语句。
你应该让你的功能更简单。这是一个做你所寻求的例子。
bool isPrime(int num) {
return isPrimeRec(num, 2);
}
bool isPrimeRec(int num, int div) {
if ( num == div || num == 1 )
return true;
else if ( num % div == 0 )
return false;
else
return isPrime(num, div+1);
}
在此示例中,首先检查此迭代是否足以找到答案。如果不是,则递增除数并递归地应用操作。我还使用了两个不同的函数来简化您设置参数的方式。避免嵌套循环和条件将帮助您查看代码。
这是函数式编程和尾递归的一个例子。