2016-04-21 39 views
4

我試圖用for循環轉換爲遞歸方法作爲編碼Kata實踐(試圖解決遞歸方法的問題)的一部分。邏輯上沒有多少東西,但是無法插入遞歸函數斷點VS2013

  • 遞歸方法中的任何地方都不會觸發斷點。
  • 我試圖放置一個記錄器(控制檯輸出)來檢查方法是否被調用,但沒有記錄。

這裏的方法定義(一個或多個):

// Original method with for loop 
    public IEnumerable<Tuple<int, int>> GetElementWithLargestDeltaOnTimeline(int[] a) 
    { 
     int runningLindex = 0; 
     int currLValue = a[0]; 
     int runningHindex = 1; 
     int currHvalue = a[1]; 
     int currDelta = 0; 

     for (int i = 1; i < a.Length - 1; i++) 
     { 
      if (a[i] < currLValue) 
      { 
       currLValue = a[i]; 
       runningLindex = i; 
      } 

      for (int j = runningLindex + 1; j < a.Length; j++) 
      { 
       if ((a[j] - currLValue) > currDelta) 
       { 
        currDelta = a[j] - currLValue; 
        runningHindex = j; 
        currHvalue = a[j]; 
       } 
      } 
     } 

     yield return new Tuple<int, int>(currLValue, runningLindex); 
     yield return new Tuple<int, int>(currHvalue, runningHindex); 
    } 

遞歸 -

// Trying above method to convert to recursive, 
    // Note - It may not be correct *shy* but the problem is why it's not doing anything(not step through/logging) 
    public IEnumerable<Tuple<int, int>> GetElementWithLargestDeltaOnTimelineRec 
     (int[] a, int i, int j, int runningLindex, int currLValue, int runningHindex, int currHvalue, int currDelta) 
    { 
     Console.WriteLine("Iteration i-{0}: j-{1} runningLindex-{2} currLValue-{3} runningHindex-{4} currHvalue-{5} currDelta-{6}" 
            , i, j, runningLindex, currLValue, runningHindex, currHvalue, currDelta); 
     if (i < a.Length) 
     { 
      if (a[i] < currLValue) 
      { 
       currLValue = a[i]; 
       runningLindex = i; 
      } 

      if (j < a.Length) 
      { 
       if ((a[j] - currLValue) > currDelta) 
       { 
        currDelta = a[j] - currLValue; 
        runningHindex = j; 
        currHvalue = a[j]; 
       } 

       GetElementWithLargestDeltaOnTimelineRec(a, i, j++, runningLindex, currLValue, runningHindex, currHvalue, currDelta); 
      } 
     } 
     else 
     { 
      yield return new Tuple<int, int>(currLValue, runningLindex); 
      yield return new Tuple<int, int>(currHvalue, runningHindex); 
     } 

     GetElementWithLargestDeltaOnTimelineRec(a, i++, runningLindex + 1, runningLindex, currLValue, runningHindex, currHvalue, currDelta); 
     yield break; 
    } 

主 -

public class Program 
{ 
    public static void Main() 
    { 
     var a = new[] { 10, 9, 3, 6, 7, 8, 15, 10, 6 }; 
     var val = new StockManager(); 
     var result = val.GetElementWithLargestDeltaOnTimelineRec(a, 0, 0, 0, a[0], 1, a[1], 0); 
    } 
} 

問題(S) -

  • 遞歸方法調用是什麼(不正確),這是造成 的問題?
  • 爲什麼該方法沒有被調用並返回空的 結果沒有失敗/錯誤/警告?

其他信息 - .NET 4.5時,Visual Studio 2013

我也試着運行不同的機器上的代碼(只是爲了驗證,如果事情是錯我的VS實例)。

+1

鑑於您發佈的示例代碼,您的方法實際上並未執行:它返回一個「IEnumerable」,並且您沒有執行任何操作。嘗試在'Main()'中迭代'result',你會看到記錄的東西。 –

回答

3

有一個小方法,返回IEnumerable。你應該枚舉它們!

而不是在內部調用GetElementWithLargestDeltaOnTimelineRec你應該枚舉它並返回它的元素或存儲結果以備後用。 IEnumerable除非列舉,否則無所作爲。

foreach (var e in GetElementWithLargestDeltaOnTimelineRec(...)) 
    yield return e; 

或者

var innerResult = GetElementWithLargestDeltaOnTimelineRec(...); 

,並使用innerResult某種程度上是導致它被列舉。