C - 打印素数列表(递归)

时间:2016-01-29 23:04:31

标签: c if-statement recursion primes

我在学校的C编程作业中遇到了一些问题。我应该从给定范围内返回素数,并且必须使用递归来完成。

到目前为止,我所获得的代码是:

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

int primeNumberList(int n, int m, int z);

int main() {
    int n1 = 0,
        n2 = 10,
        d = 2;

    printf("n1 = %d | n2 = %d | d = %d\n\n", n1, n2, d);    
    printf("Prime Numbers between %d and %d are: \n", n1, n2);

    primeNumberList(n1, n2, d);

    printf("\n\n");

    return 0;
}

int primeNumberList(int n, int m, int z) {
    int notPrime = 0;

    if (n <= 1) {
        primeNumberList(n + 1, m, z);
    } else
    if (n < m) {
        if (z <= n / 2) {
            if (n % z == 0) {
                notPrime = 1;
                z = 2;
            } else {
                primeNumberList(n, m, z + 1);
            }
        }
        if (notPrime == 0) {
            printf("%d ", n);
        }
        primeNumberList(n + 1, m, z);
    }
}

当我执行此操作时会发生的事情是,在经过所有数字达到限制之后(在m n2 main nreturn 0; 1)}))它不会打破递归,但不知何故设法从printf中减去数字,并开始打印一些非素数的其他数字。 当我在调试中运行它时,它似乎在最后循环,但没有任何东西可循环...我已尝试添加n < m甚至$app['twig'] = $app->extend('twig', function ($twig) { $twig->addFilter(new \Twig_SimpleFilter('chgname', function ($string) { return substr($string, 0, 5); })); return $twig; }); 有一些文字,但它完全忽略了它。

有谁能看到我在这里做错了什么?为什么self.request.remote_addr.get()时没有停止?

3 个答案:

答案 0 :(得分:3)

我找到了你的问题。每次调用primeNumberList时,您都有可能进行两次递归调用。

primeNumberList(n, m, z+1);返回后(在最里面的else下),您仍然可以继续打印素数并拨打primeNumberList(n+1, m, z);。这不是您想要的行为,您希望在此内部else调用后直接返回。

只需在每次致returnprimeNumberList变为primeNumberList(x);)之前添加return primeNumberList(x);,并在此功能结束时添加return 0 (这最后return只是为了让编译器满意。)

答案 1 :(得分:1)

尝试更清洁的东西:定义一个单独的isPrime函数并调用它。

http://www.cquestions.com/2011/08/prime-number-program-in-c-using.html

int isPrime(int num,int i){

  if(i==1){
      return 1;
  }else{
     if(num%i==0)
       return 0;
     else
       isPrime(num,i-1);
  }
}

答案 2 :(得分:1)

您的递归函数退出条件不正确。

当你调用递归函数时,它会结束然后向下。当我逐步运行你的代码时,由于它是 up ,我得到完整的素数列表,如下所示: enter image description here

然后继续并打印以下数字:
enter image description here

您的问题 当n&lt; 为什么不停止?毫升
因为当您开始展开时,存储在值n中的值也会通过已调用的递归的迭代开始向下展开,从而允许执行流保持在循环中。 此外,如果unwind将执行流程带到通过printf("%d ", n);语句的点,则{<1}}的值(无论它在展开迭代中的值)将被打印出来。

离开n以外的任何东西离开的一种方法是创建旁路变量,并将其用作打印标准:

n == 10

如果您想在展开时不再打印任何值,请将static done = 0; 设置为1。

这是一个修改过的函数:

done