用于打印整数的素数因子元素的递归函数

时间:2012-12-07 18:02:04

标签: c++ recursion

我需要编写一个递归函数来打印整数的素数因子元素,升序。

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)

2 个答案:

答案 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. 打印错位,导致因素按降序打印;
  2. 在递归调用之后,你继续尝试进一步的除数,这会导致输出中出现重复的因子。

答案 1 :(得分:1)

NPE提供了一个(尾部)递归版本,这里是迭代版本:

我们在这里做的是:

  1. 我们的第一个可能的除数是2.试试这个值。
  2. 如果它将数字均分,则打印除数,然后用除数除以目标数。
  3. 如果不分,则尝试下一个除数。 div += 1
  4. 请注意,当它分开时,我们不会增加div。这是因为像20这样的情况,其中2多次划分。

    void printPrimeFactors(int num) {
        int div = 2;
    
        while (num != 1) {
            if (num % div == 0) {
                cout << num << " ";
                num /= div;
            } else {
                div += 1;
            }
        }
    }