2016-05-29 78 views
2

遞歸時,遞歸中的收益率返回值也不會返回值。當我調用代次排列時,第2個GeneratePermutations(list, startCount, permutationCount)確實返回了6次(yield return permutationList;)。但由於某種原因,第一個GetPermutations中的result不包含任何內容,即使我在結果上調用了.ToList()即使在「.ToList()」調用

這是否有什麼做遞歸?

Test.cs

IEnumerable<int[]> actual = _sut.GetPermutations(3).ToList(); 

Perm.cs

public class Perm 
{ 
    public IEnumerable<int[]> GetPermutations(int permutationCount) 
    { 
     int[] permutationList = Enumerable.Range(1, permutationCount).ToArray(); 
     IEnumerable<int[]> result = GeneratePermutations(permutationList, 0, permutationCount - 1).ToList(); 

     // Doesn't contain any value! 
     return result; 
    } 

    // http://stackoverflow.com/a/756083/4035 
    private IEnumerable<int[]> GeneratePermutations(int[] permutationList, int startCount, int permutationCount) 
    { 
     if (startCount == permutationCount) 
     { 
      // Does return 6 times here. 
      yield return permutationList; 
     } 
     else 
     { 
      for (int i = startCount; i <= permutationCount; i++) 
      { 
       Swap(ref permutationList, startCount, i); 
       GeneratePermutations(permutationList, startCount + 1, permutationCount).ToList(); 
       Swap(ref permutationList, startCount, i); 
      } 

     } 
    } 

    // http://stackoverflow.com/a/2094316/4035 
    public static void Swap(ref int[] list, int index1, int index2) 
    { 
     int tmp = list[index1]; 
     list[index1] = list[index2]; 
     list[index2] = tmp; 
    } 
} 
+0

與您的問題無關:在GetPermutations()中獲取您的數據類型quirkiness。你不需要'List ':扔掉鑄件。 –

+0

@QualityCatalyst:我只是在源代碼和代碼中都改變了建議的類型。 – Sung

+1

請注意''Swap'方法中不需要'ref'。 –

回答

3

你的問題是,你永遠不回你的遞歸調用的結果和你有相同的陣列工作的所有時間。這將是你的代碼最快的修復(不是最好的,但我敢肯定你會從這裏看着辦吧):BTW

IEnumerable<int[]> perms = GeneratePermutations(
    new List<int>(permutationList).ToArray(), 
    startCount + 1, permutationCount); 

foreach(int[] perm in perms) 
    yield return perm; 

:可以使整個類的靜態和通用

Proof on dotNetFiddle

+0

是的,的確,問題在於我正在研究相同的'permutationList'並每次修復問題時創建一個副本。謝謝 – Sung

相關問題