通过递归确定数字是否为素数

时间:2015-04-24 09:13:47

标签: c++ recursion

我目前正在编写一个使用递归来查看数字是否为素数的函数,这是我到目前为止所拥有的:

我的宣言是

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 ++的新手,所以我不确定你是如何将参数设置为以某个数字开头的。但是当我运行这个功能时,视觉工作室就崩溃了。有什么想法吗?

2 个答案:

答案 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);
}

在此示例中,首先检查此迭代是否足以找到答案。如果不是,则递增除数并递归地应用操作。我还使用了两个不同的函数来简化您设置参数的方式。避免嵌套循环和条件将帮助您查看代码。

这是函数式编程和尾递归的一个例子。