2015-05-04 1 views
1

Я пытаюсь сгенерировать все перестановки в списке, но каждый раз, когда я возвращаю список, который я перехожу, возвращается к исходному состоянию, что с ним происходит?Сбрасывать список при каждой рекурсии при попытке перестановки

public static void PermuteAndSolve(List<City> cities, int recursionLevel, int Length) 
    { 
     if (recursionLevel == Length) 
     { 
      foreach (City city in cities) 
      { 
       Console.Write(city.name); 
      } 
      Console.WriteLine(""); 
     } 
     else 
     { 
      for (int i = recursionLevel; i <= Length; i++) 
      { 
       swap(cities, recursionLevel, Length); 
       PermuteAndSolve(cities, recursionLevel + 1, Length); 
       swap(cities, recursionLevel, Length); 


      } 
     } 
    } 

Я знаю, что своп работает правильно.

+0

игнорировать тот факт, что это называется PermuteAndSolve и не делает никакого решения атм – Awia

+0

что делает своп делать? Кроме того, что вы подразумеваете под сбросом? –

+0

swap буквально меняет 2 значения, указанные в списке, и с помощью сброса я имею в виду, что он возвращается обратно к исходному списку, переданному в функцию – Awia

ответ

0

Оказывается, я идиот, и я добавил дополнительную замену после рекурсии случайно. Реальный код следует читать:

public static void PermuteAndSolve(List<City> cities, int recursionLevel, int Length) 
    { 
     if (recursionLevel == Length) 
     { 
      foreach (City city in cities) 
      { 
       Console.Write(city.name); 
      } 
      Console.WriteLine(""); 
     } 
     else 
     { 
      for (int i = recursionLevel; i <= Length; i++) 
      { 
       swap(cities, recursionLevel, Length); 
       PermuteAndSolve(cities, recursionLevel + 1, Length);      
      } 
     } 
    } 
0

Я не претендую на то, чтобы точно понимать, что делает этот код, но, конечно же, вы можете достичь того, что вы пытаетесь сделать, без рекурсивного разума? Что-то вроде этого (ВНИМАНИЕ: непроверенные):

public static void PermuteAndSolve(List<City> cities, int Length) 
{ 
    int recursionLevel = 0; 
    while(recursionLevel < Length) 
    { 
     for (int i = recursionLevel; i <= Length; i++) { 
      swap(cities, recursionLevel, Length); 
     } 
     recursionLevel++; 
    } 

    foreach(City city in cities) 
    { 
     Console.Write(city.name); 
    } 
    Console.WriteLine(""); 
} 

не может быть правильным, но, надеюсь, вы получите мою точку зрения.

+0

Предполагается создать и распечатать все перестановки списка, что он делает, если я пройду через отладчик но не тогда, когда он на самом деле печатает их. Насколько мне известно, ваш код не перестраивает, он меняет местами немного. – Awia

+0

Перестановки без рекурсии просто любопытные, чтобы сделать, мне удалось это в Haskell достаточно легко, это просто извращает меня, что мне сложнее достичь на C#, чем в кровавом Haskell – Awia

+0

Посмотрите на это сообщение: http: /stackoverflow.com/questions/11208446/generating-permutations-of-a-set-most-efficiently – garryp

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