程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-遞歸問題,求n的階乘?

c語言-遞歸問題,求n的階乘?

編輯:編程綜合問答
遞歸問題,求n的階乘?

圖片說明

 int sum2(n) {
    int sum=0;
    if (n<0) printf_s("error\n");
    //else if (n == 0 || n == 1) sum = 1; 
    else sum = sum2(n - 1)*n;
    return sum;
}

上圖是將注釋的話沒有寫在程序中的結果,不能理解為什麼會是這樣。。。

最佳回答:


我給你分析下,你細心看看就明白了。
遞歸調用就是不斷調用自己。然後結合堆棧的原理進行入棧出棧。
比如 f(x)進行遞歸調用 ,在調用處函數中斷。函數環境入棧。
直道有解得時候返回值,中斷處得到返回值再進行處理出棧。逐層向上直道最頂層的中斷恢復為止。
你可以認為是不斷進行任務分解直道有解得時候返回 .(有解指的是函數能執行完畢不再調用其它函數)
所以得到調用序列 f1(x),f2(x)........fn(x) {其中fn=f}

現在我們看你的程序
寫階乘 n! = n*(n-1)!
f(x) = x!
f(n) = n * f(n-1) :函數在f(n-1)中斷 fn-1
f(n-1) = (n-1)*f(n-2) : 函數在f(n-2)中斷 fn-2
...
...
f(1) = 1 * f(0) : 函數在f(n-2)中斷 f0 中斷
這個時候就是關鍵的步驟。我們要設置 函數的解,不然你可以寫出 f(-1),f(-2)....
也就是我們要設置函數的出口定義。
既然是出口要寫在自身調用的上面,否則先自身調用再出口那麼出口就是不可到達。
一旦定義了出口,就是結束函數調用的時點

你程序設計的時點是 :

    if (n<0) printf_s("error\n");

你看程序在此時打印出error之後,會執行什麼啊? 應該是 return sum巴
sum是多少阿? 由於你在函數首句定義了sum=0,所以最後一次返回的是0
這樣 導致沒層中斷的返回值都是0
所以結果就是0了

按照上面的分析你可一寫出

    if(n==1)
        return 1
        retturn sum2(n - 1)*n
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved