C# 尝试排列时,在每个递归上列出重置

C# 尝试排列时,在每个递归上列出重置,c#,recursion,traveling-salesman,C#,Recursion,Traveling Salesman,我试图生成一个列表的所有排列,但每次我递归我传入的列表时,它都会被重置回其原始状态,这是怎么回事 public static void PermuteAndSolve(List<City> cities, int recursionLevel, int Length) { if (recursionLevel == Length) { foreach (City city in cities) {

我试图生成一个列表的所有排列,但每次我递归我传入的列表时,它都会被重置回其原始状态,这是怎么回事

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);


            }
        }
    }

我知道swap可以正常工作。

我并不假装完全理解这段代码在做什么,但您肯定可以在不使用费心的递归的情况下实现您想要做的事情吗?类似这样的警告:未经测试:

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("");
}

可能不正确,但希望你明白我的意思。

结果证明我是个白痴,我在递归之后意外地添加了额外的交换。 实际代码应为:

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);                    
            }
        }
    }

忽略一个事实,即它被称为PermuteAndSolve,并且不执行任何解决方案,而swap做什么呢?另外,你说的重置是什么意思?swap实际上是交换列表中指定的2个值,我说的重置是指它变回传递到函数中的原始列表。你说的列表重置是什么意思?你在这里想做什么?也许有一种不那么令人困惑的方法可以做到这一点?它应该创建并打印列表的所有排列,如果我使用调试器,它会这样做,但当它实际打印它们时,它不会这样做。你的代码并没有进行置换,只是在我所知的范围内进行了一点交换。没有递归的置换有点烦人,我在Haskell中很容易就完成了,只是让我感到奇怪的是,我发现在C中比在血腥的Haskell中更难实现。看看这篇文章: