C#

2012-07-31 31 views
0

我有以下的遞歸函數C#

public int Factorial(int number_to_calculate) 
{ 
    if (StackChanged != null) 
    { 
     StackChanged(new CustomEventArgs(StackValue, Result)); 
    } 

    System.Threading.Thread.Sleep(wait_time); 
    if (number_to_calculate == 0) 
    { 
     StackValue--; 
     return 1; 
    } 
    else 
    { 
     StackValue++; 
     Result = (number_to_calculate * Factorial(number_to_calculate - 1)); 
    } 

    if (StackChanged != null) 
    { 
     StackChanged(new CustomEventArgs(StackValue, Result)); 
    } 
    StackValue--; 
    System.Threading.Thread.Sleep(wait_time); 
    return Result; 
} 

顯然,我的上司是不正常和我有2個回報,但要功能是遞歸的。所以我只需要一個回報。我已經試過用goto開始的累加器,以便只有一個返回,但是我需要每次函數調用自己時遞增StackValue,並在遞歸出現時遞減。這樣我就不知道它何時出來。

有沒有人有任何想法?

+3

這聽起來像有嚴格的編碼標準,這不是一件壞事。然而我的猜測是,如果你的主管不喜歡多個出口點,那麼'goto'也不會飛。 – OnResolve 2012-07-31 12:39:28

+0

是的,請不要使用goto's * ever *。另外,Result的定義在哪裏? – 2012-07-31 12:40:06

+0

@OnResolve:即使「沒有嚴格的編碼標準」,也應該避免跳轉。正如傑拉德所說。 – 2012-07-31 12:41:06

回答

3

而不是

if (number_to_calculate == 0) 
    { 

     StackValue--; 

     return 1; 

    }... 

if (number_to_calculate == 0) 
    { 

     result = 1; 

    } 
+0

做到了。顯然離開StackValue--;有什麼東西混亂。謝謝 – robertpas 2012-07-31 12:46:07

+0

@robertpas - 那會是因爲如果你在返回'result'之前執行'StackValue - ',那麼你將不會一次刪除'StackValue'兩次。儘管我希望你真的瞭解解決方案,否則你會遇到問題。 – 2012-07-31 13:27:29

3

使函數具有單個返回語句的最簡單方法是將要返回的值存儲在變量中,然後在最後返回它。所以,你會轉換成類似以下內容:

int myFunc() { 
    if (cond) 
     return x; 
    else 
     return y; 
} 

弄成這個樣子:

int myFunc() { 
    int returnValue; 
    if (cond) 
     returnValue = x; 
    else 
     returnValue = y; 
    return returnValue; 
} 

這一原理可以普遍適用於任何方法,只要你照顧,當你改變將語句返回給變量賦值,您將設置條件以便跳過其餘代碼。

但是,像這樣的要求是相當隨意的。通常期望遞歸具有多個返回語句。

0
int Factorial(int number) 
     { 
      int result = 1; 
      StackValue++; 
      if (StackChanged != null) 
       StackChanged(new CustomEventArgs(StackValue, Result)); 

      if (number > 1) 
      {  
       System.Threading.Thread.Sleep(wait_time); 
       result = number * Factorial(number - 1); 
      } 

      StackValue--; 
      if (StackChanged != null) 
       StackChanged(new CustomEventArgs(StackValue, Result)); 

      return result; 
     }