【发布时间】:2017-08-15 20:01:09
【问题描述】:
我开始自学 C 并尝试构建一组有用的函数和程序以供将来参考。如果相关,这是 C99。
这是我最近一次迭代的程序。在输出端,我想得到一个数 n 的素数分解。但是,按原样,我得到了所有因素的列表,并且没有重复任何因素。我包含了一些打印语句来尝试和调试,并发现错误与递归有关,但无法弄清楚如何进一步解释它。我之前尝试过创建 int 类型的递归函数,但很难让它与数组 p 一起使用。
- n 是我要考虑的数字
- p 是一个数组,用于存储找到的素数
- j 是 p 的索引
- c 是我作为 n 的除数测试的数字
我知道可能有更有效的方法来声明 p 以节省内存,但由于这主要是为了参考,内存不是一个大问题。
我发现了这些问题,但认为它们没有回答我的问题
- finding greatest prime factor using recursion in c:这个问题是关于崩溃代码的。我的编译、运行并产生合理合理的输出,我只是想知道为什么输出不是我所期望的。
- is there ever a time you would not use recursion? [closed]:这表明递归不是素数分解的好选择——我不知道,但怀疑这也适用于 C。由于这是供参考,我认为这不是一个大问题。如果您不同意,请说明原因。
我的主要问题是: 为什么输出显示 n 的所有因子? 为什么它不重复主要因素? 我该怎么做才能修复它?
#include <stdio.h>
#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))
void factors(int n, int p[], int j) {
/// if n is divisible by c, store c, and continue with n/c
int c;
for (c=2; c < n; c++) {
if (c > n) break;
if (n%c == 0) {
p[j] = c;
printf("%d has been added to p \t", c);
printf("n has been reduced to %d \t", n/c);
printf("j is %d \n", j);
j++;
if (n == c) break;
factors(n/c, p, j);
}
}
}
int main() {
/// set up number to factor, and array to hold factors
int n = 24;
int p[n/2];
int i=0;
for (i=0; i<NELEMS(p); i++) {
p[i]=0;
}
int j = 0;
factors(n, p, j);
printf("the prime factors of %d are:\n",n);
for (i=0; i<NELEMS(p); i++) {
printf("%d \n", p[i]);
}
}
【问题讨论】:
-
你好像发了半个程序。
-
“这表明递归不是素数分解的好选择” 事实上,递归对于你能想到的几乎所有任务都是不利的。递归的用途非常狭窄,我能想到的唯一用途是存储优化二叉树和一些数学模拟理论任务。在 99% 的情况下,递归会使算法变慢、消耗内存成为危险。它通常也很难阅读。尽管它无用,但学校和书籍往往将重点放在递归上,因为“它看起来很花哨”。但在现实世界中,您应该像避免瘟疫一样避免它。
-
@Lundin 在 C 中可能是正确的,但在其他语言中肯定不是这种情况,因为递归是您的主要(和惯用)循环结构
-
@naomik 这只是因为高级语言的程序员通常不知道无效、危险的递归会产生什么。此类语言的程序员通常不知道他们的源代码如何转换为机器代码。
-
@Lundin 你基本上说了两次同样的话
标签: c recursion prime-factoring