【发布时间】:2016-05-07 20:20:17
【问题描述】:
我在学校的 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没有return声明? -
if(z
-
@Ben:使用“return 0;”或“返回;”也不起作用,如果这是您的意思,或者您的意思是应该将值分配给返回的变量?
-
@Christoffer 您有可能为每个调用进行两次递归调用,我认为这就是让您感到困惑的原因。目前,在
primeNumberList的开头添加if(n == m-1) exit(1);是一种可行的hacky 解决方案。 -
@River:非常感谢,它应该可以正常工作!您提到这是一个 hacky 解决方案,这是否意味着您通常不应该使用它,或者仅仅是因为我的编码有点混乱,因此它比替代方案更容易使用?
标签: c if-statement recursion primes