C++ 用于打印整数的素因子分解元素的递归函数

C++ 用于打印整数的素因子分解元素的递归函数,c++,recursion,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)

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

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

我的最小输入是一个素数,递归函数的较小输入是
num div(num的最小素数除法器)

我相信以下方法会起作用:

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);
        }
}
void printPrimeFactors(int num,int div=2)
{
如果(num%div==0){
NPE提供了一个(尾部)递归版本,下面是迭代版本:

我们在这里所做的是:

  • 我们第一个可能的除数是2。试试这个值
  • 如果它将数字平均除以,则打印除数,并将目标数字除以该除数
  • 如果它不除法,请尝试下一个除法。
    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;
            }
        }
    }
    
    void printPrimeFactors(int num){
    int div=2;
    while(num!=1){
    如果(num%div==0){
    
    你能看到什么让你认为你做错了什么吗?我的输出,20年,它是:5 2将其编辑到你的问题中。你不应该循环和重复。否则我怎么能找到除以num的最小素数?没有必要
    isPrime(div)
    。如果
    div
    不是素数,那么一些数字
    x
    其中
    2因为它是我大学作业的一部分,我不允许
    在它工作时中断;
    一个循环。@sharth它短路了对
    num%div==0
    的检查。不过,它似乎不太可能对性能有实际好处,o当然,但只是为了扮演魔鬼代言人。@sharth:这是一个很好的观点,谢谢。我已经完全重做了解决方案。我相信新的解决方案会更好(而且正确!)@femtoRgon:我无法想象
    iPrime(div)
    的成本接近
    num%div
    isPrime
    的成本将高出几个数量级。谢谢你,伙计,但我应该写一个递归函数。
    void printPrimeFactors(int num) {
        int div = 2;
    
        while (num != 1) {
            if (num % div == 0) {
                cout << num << " ";
                num /= div;
            } else {
                div += 1;
            }
        }
    }