C 不使用exit语句的递归。,

C 不使用exit语句的递归。,,c,recursion,return,C,Recursion,Return,我写了一个程序来查找输入的数字的素数因子 #include<stdio.h> #include<conio.h> #include<stdlib.h> void pf(int, int,int); int main() { int num,i=2,j=2; printf("Enter a number : "); scanf("%d", &num); pf(num,i,j); getch(); retu

我写了一个程序来查找输入的数字的素数因子

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

void pf(int, int,int);
int main()
{
    int num,i=2,j=2;
    printf("Enter a number : ");
    scanf("%d", &num);
    pf(num,i,j);
    getch();
    return 0;
}
void pf(int num,int i, int j)
{
    int rem, rem2; 
    if(num==1)
        exit(1);
    if(i>j)
    {
        rem=i%j;
        if(rem==0)
            pf(num,i+1,2);
        if(rem!=0)
            pf(num,i,j+1);
    }
    if(i==j)
    {
        rem2=num%i;
        if(rem2==0)
        {
            printf("%d, ", i);
            num=num/i;
            pf(num,i,j);
        }
        if(num!=1)
            pf(num,i+1,2);
    }
}
#包括
#包括
#包括
无效pf(int,int,int);
int main()
{
int num,i=2,j=2;
printf(“输入一个数字:”);
scanf(“%d”和&num);
pf(num,i,j);
getch();
返回0;
}
无效pf(整数、整数i、整数j)
{
int-rem,rem2;
如果(num==1)
出口(1);
如果(i>j)
{
rem=i%j;
如果(rem==0)
pf(num,i+1,2);
如果(rem!=0)
pf(num,i,j+1);
}
如果(i==j)
{
rem2=num%i;
如果(rem2==0)
{
printf(“%d”,i);
num=num/i;
pf(num,i,j);
}
如果(num!=1)
pf(num,i+1,2);
}
}

我正在研究递归,但我经常使用
exit()
语句。当我使用
return
语句时,它变得非常困难。有谁能告诉我如何用
return
语句替换这个程序中的exit语句吗。该程序运行良好,但在输入大量数据时,程序每次都会崩溃。

我在您的代码中发现两个问题。也许解决了这两个问题之后就没事了:

  • 退出(1)
    替换为
    返回1
  • 之后,如果(i==j)
    ,则必须执行以下操作:

  • 如果
    pf
    要返回,则必须连同其所有调用一起返回。
    所以,我提议这样的改变

    #include <stdio.h>
    
    void pf(int n, int d);
    
    int main(void){
        int num;
        printf("Enter a number : ");
        scanf("%d", &num);
        pf(num, 2);
        return 0;
    }
    
    void pf(int num, int i){
        if(num == 1)
            return ;
        if(num % i == 0){
            printf("%d, ", i);
            pf(num / i, i);
            return ;
        }
        if(i == 2)
            pf(num, i + 1);
        else
            pf(num, i + 2);
    }
    

    只需将返回值1替换为退出位置(1)@Siraj一个数字的素数因子是什么?@Siraj如果(真)该语句的含义是什么?素数因子是一个数字的简单因子,例如,24有素数因子2,2,2,3,18有素数因子2,3,3,这意味着,将这些数字相乘将给出输入的数字。这个数的所有因子都应该是素数,2,3,5,7,11等等!!ohhh,用rem2==0替换TRUE,它只在程序崩溃后4位整数才起作用,而且你怎么能从声明为void的函数返回呢?我无法开发他的逻辑@ameyCUNo,它与20000(5个数字)合作得很好。我不认为它的声明无效在其中做了任何错误。今天我加入了stackoverflow,我真的很高兴来到这里。非常感谢@BLUEPIXYNote,算法非常慢。对于1111000到1111010范围内的值,可能需要32秒才能找到1111004的素数因子(2、2和277751),其中不同的算法需要毫秒。当这些因素很小时,它似乎起作用,但当它们很大时,则需要很长的时间。这与这个答案中的分析完全无关,这很好,对于1111007这样的素数,它比非常慢更糟糕。它花费了7m 36秒,进程大小达到了2432748(通过Mac上的ps-l测量)。这是一个庞大的项目规模和很长的时间。我对它的完成感到有点惊讶(当它确实完成时,我是用“它不完成”来起草这个评论的)。它没有说关于算法。我认为它可能会在32秒之前发生堆栈溢出。
    #include <stdio.h>
    
    void pf(int n, int d);
    
    int main(void){
        int num;
        printf("Enter a number : ");
        scanf("%d", &num);
        pf(num, 2);
        return 0;
    }
    
    void pf(int num, int i){
        if(num == 1)
            return ;
        if(num % i == 0){
            printf("%d, ", i);
            pf(num / i, i);
            return ;
        }
        if(i == 2)
            pf(num, i + 1);
        else
            pf(num, i + 2);
    }
    
    void pf(int num, int i){
        if(num == 1)
            return ;
        if(num % i == 0){
            printf("%d, ", i);
            pf(num / i, i);
        } else {
            pf(num, i + 1 + (i != 2));
        }
    }