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

あなたは標準などを気にしていないようなので、階乗を印刷するための再帰的な 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;
}
于 2012-12-19T09:18:01.163 に答える
0

mainプログラムの実行時に呼び出すことができるのは、オペレーティング システムだけです。オペレーティング システム以外の誰も、 という名前の関数を呼び出すことはできませんmain。したがって、再帰を使用して階乗を計算する場合は、別の関数を作成して再帰的に計算し、その関数を から呼び出す必要がありますmain

これはなぜですか?答えは、これが構文です。

于 2012-12-19T09:36:21.777 に答える