2015-10-21 122 views
0

試驗例:C#遞歸功能附加

B = 3

C = 19

常數= 4

薩姆= 55

(3 + 7 + 11 + 15 + 19 = 55)

邏輯是:使用遞歸函數i添加算術線的數字NG

但我的代碼只輸出「返回C」線

class Program 
{ 
    static int Line(int b, int c, int constant, int sum) 
    { 

     if (b > c) return c; 
     return (sum = sum + (Line(b+constant, c, constant, sum))); 

    } 
    static void Main(string[] args) 
    { 

     Console.WriteLine(Line(3,19,4,0)); 
     Console.ReadKey(); 
    } 
} 
+2

如果這個點來計算總和話,我明白你爲什麼會在'sum'參數傳遞。 – juharr

回答

3

調試(只是把破發點,看看發生了什麼事),你可以很容易地找到兩個錯誤後在你目前的實施中:

static int Line(int b, int c, int constant, int sum) { 
     if (b > c) 
     return sum; // return "sum", not "c" 

     // "= b +" not " = sum +" 
     return (sum = b + (Line(b + constant, c, constant, sum))); 
    } 
+2

難道那不就是'return b + Line(b + constant,c,constant,sum);'因爲'sum'的賦值在'return'之後顯然不被使用? – juharr

+0

@juharr:你說得對,'return b + ...'是一個更好的選擇(當'for'循環明顯時,恕我直言,是最好的選擇);然而,我的實際目標是指出*調試*(*兩個'return'上的斷點*)可以幫助輕鬆解決問題。 –

+1

它確實必須'如果(b> c)返回和;'。因爲當你在最後一個堆棧中時,sum的值仍然是0.所以你可以讓它'if(b> c)返回0;'並且沒有改變。 –

2

看起來你並不需要通過sum。在這種情況下,如果你願意的話,你可以將它減少到一行。你也可能想爲參數選擇更有意義的名稱。

static int Line(int start, int end, int increment) 
{ 
    return start > end? 0 : start + Line(start + increment, end, increment); 
} 

所以默認情況是start > end你剛剛返回0,否則,你添加start到它添加到incrementstart傳遞一個進入遞歸調用下一次迭代。

另外還有就是沒有遞歸解決方案

static int LineNonRecursive(int start, int end, int increment) 
{ 
    int sum = 0; 
    while (start <= end) 
    { 
     sum += start; 
     start += increment; 
    } 

    return sum; 
} 
+0

從*三元運算符到*參數*名稱的好實現,從我+1。 –