1

特定の数値の階乗を 200 万回計算するのに必要な時間を表示するプログラムを作成しています。C/C++ Eclipse 環境で Debian Linux を使用して書いています。プログラムが に到達するint temp = n * rfact(n-1);と、ハングして他に何もしません。

ここに私がこれまでに持っているものがあります:

#include <stdio.h>
#include <time.h>

//prototypes
int rfact(int n);

main()
{
    int n = 0;
    int i = 0;
    double result = 0.0;
    clock_t t;
    printf("Enter a value for n: ");
    scanf("%i", &n);

printf("n=%i\n", n);

    //get current time
    t = clock();

    //process factorial 2 million times
    for(i=0; i<2000000; i++)
    {
        rfact(n);
    }

    printf("n=%i\n", n);

    //get total time spent in the loop
    result = (clock() - t)/(double)CLOCKS_PER_SEC;

    //print result
    printf("runtime=%d\n", result);
}

//factorial calculation
int rfact(int n)
{
    int temp = n * rfact(n-1);
    printf(i++);
    return temp;
}
4

3 に答える 3

5

基本ケースが欠落しているため、無限再帰が発生しています。n == 1またはに到達したら停止する必要がありますn == 0

int rfact(int n)
{
    if (n <= 0)
        return 1;
    return n * rfact(n-1);
}

また、階乗関数は実際には再帰の最適な使用例ではありません。反復バージョンの方が間違いなく読みやすく、おそらくはるかに高速だからですが、それは別の話です :)

于 2013-02-25T00:34:39.147 に答える
1

私の上の人々に同意します、あなたは再帰の基本ケースを欠いています

ただし、階乗を 2'000'000 回実行することに注意してください。計算が終了するまでに多くの時間がかかるだけでなく、変数がオーバーフローします。

于 2013-02-25T01:13:55.553 に答える
1

rfact 関数には基本ケースがありません。これは、 rfact(n-1) が永久に呼び出されることを意味します。

于 2013-02-25T00:34:46.720 に答える