0

我正在编写一个程序来使用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. 有人可以帮我修改上述程序以获得正确的结果。此外,在()rv中的连续递归调用之间捕获正确值的逻辑是什么?main

4

2 回答 2

13

由于您似乎不关心标准和东西,这里是用于打印阶乘的递归主函数的实现,它在 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;
}
于 2012-12-19T09:18:01.163 回答
0

只有操作系统main在运行程序时才能调用。除了操作系统之外,没有人可以调用任何名为main. 因此,如果想使用递归计算阶乘,则必须编写另一个函数来递归计算并从main.

你可以问这是为什么?答案是这是语法。

于 2012-12-19T09:36:21.777 回答