2013-02-25 109 views
1

我正在編寫一個程序來顯示計算給定數字階乘200萬次所需的時間。我在C/C++ Eclipse環境中使用Debian Linux編寫它。當程序到達int temp = n * rfact(n-1);時,它掛起,不會做任何事情。C中的遞歸階乘程序在執行時掛起

這裏是我到目前爲止有:

#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; 
} 

回答

5

你缺少的基本情況,所以你正在運行到一個無限遞歸。你需要停下來,當你到n == 1n == 0

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

此外,階乘函數是不是真的是最好的使用情況遞歸因爲迭代版本更易讀,並可能快了很多,但是這是一個不同的故事:)

1

你的rfact函數沒有基本情況。這意味着rfact(n-1)將被永遠調用。

1

我的人我同意上述,你缺少遞歸

的基本情況,但要注意做一個階乘2'000'000時代,你的變量將開去溢出服用大量的時間計算被終止

+0

哦哇大facepalm那裏有一個好點 – zakparks31191 2013-02-25 01:19:58