【问题标题】:Recursion without using exit statement.,不使用退出语句的递归。,
【发布时间】:2015-10-08 17:33:53
【问题描述】:

我编写了一个程序来查找输入数字的质因数。

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

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

【问题讨论】:

  • 只需将 return 1 替换为 exit(1)
  • @Siraj 一个数的质因数是什么?
  • @Siraj 另外语句 if(TRUE) 是什么意思?
  • 质因数是一个数的简单因数,例如,24 的质因数为 2,2,2,3,18 的质因数为 2,3,3,意思是,将这些数相乘将得到输入的号码。数的所有因数都应该是素数,2,3,5,7,11等等!!
  • 哦,把 TRUE 换成 rem2==0

标签: c recursion return


【解决方案1】:

如果要返回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);
}

减少代码

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

【讨论】:

  • 今天我加入了stackoverflow,我真的很高兴来到这里。非常感谢@BLUEPIXY
  • 请注意,该算法非常慢。对于 1111000 到 1111010 范围内的值,可能需要 32 秒才能找到 1111004(即 2、2 和 277751)的质因数,而不同的算法需要毫秒。当因素很小时,它似乎工作正常,但当它们很大时,则需要很长时间。这与此答案中的分析完全无关,这很好。
  • 在像 1111007 这样的素数上,它比非常慢还要糟糕。耗时 7m 36s,进程大小达到了 2432748(在 Mac 上以ps -l 测量)。这是一个巨大的程序规模和很长的时间。我对它的完成感到有点惊讶(我在实际上完成时以“它没有完成”的形式起草此评论)。
  • 它没有说关于算法。我认为它可能会在 32 秒之前堆栈溢出。
【解决方案2】:

我在您的代码中发现了两个问题。解决了这两个问题可能就好了:

  1. exit(1) 替换为return 1;
  2. if(i==j)之后,你必须这样做:
if(rem2==0) {//your code}
else pf(num,i+1,2);

【讨论】:

  • 在程序崩溃后它只能工作到 4 位整数,而且 你如何从声明为 void 的函数返回?
  • 我无法发展他的逻辑。 @ameyCU
  • 不,它适用于 20000,即 5 位数
  • 我认为声明 void 并没有做错什么。
猜你喜欢
  • 1970-01-01
  • 2017-07-28
  • 2022-12-09
  • 1970-01-01
  • 2015-11-28
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多