我在学校的 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 ))之后,它不会破坏递归,但以某种方式设法从 n 中减去数字,并且开始打印一些不是质数的其他数字。
当我在调试中运行它时,它似乎在最后循环,但没有任何东西可以循环......我尝试添加一个 return 0; 甚至一个带有一些文本的 printf,但它完全忽略了它。

谁能看到我在这里做错了什么?为什么在 n < m 时不停止?

最佳答案

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

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

因此,只需在每次调用 return 之前添加一个 primeNumberList ( primeNumberList(x); 变为 return primeNumberList(x); ),并在此函数的末尾添加一个 return 0 (最后一个 return 只是为了让编译器满意)。

关于C - 打印质数列表(递归),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35095688/

10-11 21:46