【问题标题】:Recursion using main() function [closed]使用 main() 函数递归[关闭]
【发布时间】:2012-12-06 13:54:34
【问题描述】:

我正在编写一个程序来使用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 值的逻辑是什么?

【问题讨论】:

  • 你为什么要明确使用你知道不好的东西?
  • 如何先去除seg-fault?
  • @icepack: FUBAR - 由于任意递归而完全赞成
  • p 未分配,不能尊重它。正确地做:尝试编写具有良好实践的“标准”代码
  • 你应该使用所有警告和调试信息进行编译,即在 Linux 上使用 gcc -Wall -g,改进你的代码直到没有给出警告,并学习使用 gdb 调试器(以及 @987654330 @)

标签: c linux recursion segmentation-fault


【解决方案1】:

由于您似乎并不关心标准和东西,这里是用于打印阶乘的递归主函数的实现,它在 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;
}

【讨论】:

  • YeeeHoooo... 是的,这解决了我的问题!
  • 你怎么能声称“这是一个有效的实现”? - 据你所知,它充其量只能在一些经过测试的平台上工作。
  • @TonyD:同意,已编辑。无论如何,这都是糟糕的代码。
  • 嗯,-1 到 +1 更恰当的警告示例 - 黑客,长寿和崩溃......!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2022-07-17
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2023-02-04
    • 2015-01-09
    相关资源
    最近更新 更多