我需要编写一个递归函数来打印整数的素数因子元素,升序。
void printPrimeFactors(int num)
{
int div;
if (isPrime(num) == true)
cout << num << " ";
else
{
for (div = 2; div < num; div++)
{
if (isPrime(div) == true && num%div == 0)
printPrimeFactors(num/div);
}
}
我做错了什么?我的输出,20为:
5 2 5 2 2
我的最小输入是素数,递归函数的较小输入是num div (smallest prime divider of num)
。
答案 0 :(得分:5)
我相信以下内容可行:
void printPrimeFactors(int num, int div = 2)
{
if (num % div == 0) {
std::cout << div << " ";
printPrimeFactors(num / div, div);
} else if (div <= num) {
printPrimeFactors(num, div + 1);
}
}
根据要求,它是递归的,即使递归不是必需的,也可以简单地转换为迭代。
原始版本不能正常工作的原因有两个:
答案 1 :(得分:1)
NPE提供了一个(尾部)递归版本,这里是迭代版本:
我们在这里做的是:
div += 1
。请注意,当它分开时,我们不会增加div
。这是因为像20
这样的情况,其中2
多次划分。
void printPrimeFactors(int num) {
int div = 2;
while (num != 1) {
if (num % div == 0) {
cout << num << " ";
num /= div;
} else {
div += 1;
}
}
}