c - 使用 main() 函数递归

标签 c linux recursion segmentation-fault

<分区>

我正在编写一个程序,使用 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("%d\n", rv);
        return 0;
}

该程序使用 gcc 进行编译,但在执行时,我在 **p = n 处遇到了段错误。有人可以帮我修改上面的程序以获得正确的结果吗?此外,在 main() 中的连续递归调用之间捕获正确的 rv 值的逻辑是什么?

最佳答案

因为您似乎不关心标准和其他东西,这里是用于打印阶乘的递归 main 函数的实现,它在 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("%d\n", rv);

        return rv;
}

关于c - 使用 main() 函数递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13948562/

相关文章:

linux - 突触无法访问存储库

c - 如何让套接字服务器只接受一次

linux cpio复制目录结构和文件名?

c - 带有未声明变量的 Typedef 结构

c - 如何在 Linux 内核中生成 "artificial"中断?

c - scanf ("%d",((*a+i)+j)) 和 scanf ("%d",&a[i][j]) 的区别

c - fread() : Reading from a file (without alignment) results in skipping of bytes

java - Java中的jstree递归复制

java - 为什么我在这里得到 java.lang.StackOverflowError?

python - Tkinter 的 .after() 和递归