我正在编写一个程序来使用main
()函数的递归计算阶乘。
/* Print factorial */
#include <stdio.h>
#include <stdlib.h>
static char **p;
int main(int argc, char **argv)
{
int n, rv;
if (argc < 2) {
printf("Usage: a.out <value>n");
exit(-1);
}
n = atoi(argv[1]);
if (!n) {
rv = 0;
} else {
if (n == 1) {
rv = 1;
} else {
n = n - 1;
**p = n;
main(2, p);
}
}
printf("%dn", rv);
return 0;
}
该程序使用gcc
编译,但是在执行后,我在**p = n
处得到一个细分故障。有人可以帮助我修改上述程序以获得正确的结果。另外,在main
()中连续的递归调用之间捕获正确的rv
值的逻辑是什么?
由于您似乎不在乎标准和东西,因此以下是用于打印阶乘的递归主函数的实现,该功能是在GCC上编译的(我仅在Windows上进行测试)。由于它不遵循标准,因此不能保证它会在其他编译器/平台上编译。
编写这种娱乐代码是可以的,但是永远不要让坏行为遵循严重的编码项目或工作场所。
/* Print factorial */
#include <stdio.h>
#include <stdlib.h>
char buf[16];
int main(int argc, char **argv)
{
int n, rv;
if (argc < 2) {
printf("Usage: a.out <value>n");
exit(-1);
}
n = atoi(argv[1]);
if (!n) {
rv = 1;
} else {
if (n == 1) {
rv = 1;
} else {
char *pt = buf;
char **pt2 = &pt - 1;
sprintf(buf, "%d", n - 1);
rv = main(2, pt2) * n;
}
}
printf("%dn", rv);
return rv;
}
只有操作系统运行程序时才能调用main
。除操作系统外,没有人可以调用名为main
的任何功能。因此,如果要使用递归计算阶乘,则必须编写另一个功能来递归计算并从main
调用该功能。
您可以问为什么?答案是这是语法。