2015-10-21 89 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。 –