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中更难实现。看看这篇文章: