2016-05-29 1 views
2

Когда я делаю вызов перестановок поколений, второй GeneratePermutations(list, startCount, permutationCount) действительно возвращает доход 6 раз (yield return permutationList;). Но по какой-то причине result в первом GetPermutations не содержит ничего, хотя я и вызвал .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

Независимо от вашей проблемы: получите свой тип данных quirkiness, отсортированный в 'GetPermutations()'. Вам не нужен 'List ': выбросьте кастинг. –

+0

@QualityCatalyst: Я просто изменил тип, как это было предложено на всякий случай как в источнике, так и в моем коде. – Sung

+1

Обратите внимание, что 'ref' не требуется в методе' Swap'. –

ответ

3

Ваша проблема в том, что вы никогда не возвращать результаты ваших рекурсивных вызовов и что вы работаете с тем же массив все время. Это будет самый быстрый фикс для кода (не самый лучший, но я уверен, что вы поймете это здесь):

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

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

Кстати: вы можете сделать весь класс статический и общий

Proof on dotNetFiddle

+0

Да, действительно, проблема заключалась в том, что я работал над одним и тем же «перестановочным списком» и создавал копию каждый раз, когда исправлял проблему. благодаря – Sung

Смежные вопросы