2012-12-19 86 views
-1

我正在編寫一個程序來使用遞歸main()函數來計算階乘。使用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值的邏輯是什麼?

+2

你爲什麼要明確地使用你認爲不好的東西? –

+0

如何首先刪除seg-fault? –

+2

@icepack:FUBAR - 由於任意遞歸而完全被upvoted –

回答

11

因爲你似乎不關心標準和東西,下面是一個遞歸的印刷階乘主函數的實現,它編譯在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; 
} 
+0

YeeeHoooo ...是的,這解決了我的問題! –

+0

你怎麼能聲稱「這是一個工作實施」? - 至多它恰好在一些測試平臺上工作,據你所知。 –

+0

@TonyD:同意,編輯。無論如何這是糟糕的代碼。 – nhahtdh

-1

只有操作系統運行程序時才能調用main。除操作系統外,沒有人可以調用任何名爲main的函數。因此,如果要使用遞歸計算階乘,則必須編寫另一個函數來遞歸計算並從main調用該函數。

你可以問這是爲什麼?答案是這是語法。