按数量叠加嵌套循环全排列组合算法:
static string 金箍插(string 字符串, int 量, int 插位, int 调位)
{
插位 %= 量; 调位 %= 量; 插位 = Math.Abs(插位); 调位 = Math.Abs(调位);
string 输出 = "";
int 数 = 0;
Action 获取 = delegate()
{
输出 += 数 != 调位 ? 字符串[数].ToString() : "";
数++;
};
do
{
if (数 < 插位)
获取();
else if (数 == 插位)
{
输出 += 字符串[调位].ToString();
if (插位 != 调位)
输出 += 字符串[插位].ToString();
数++;
}
else if (数 > 插位)
获取();
} while (数 < 量);
return 输出;
}
static List<string> 基本三位转换(string 字符串, int 量)
{
List<string> 输出 = new List<string>();
string 转换 = ""; int 跟 = 0;
do
{
转换 = 金箍插(字符串, 量, 0, 跟++);
输出.Add(转换);
输出.Add(金箍插(转换, 量, 量 - 2, 量 - 1));
} while (跟 < 量);
return 输出;
}
static List<string> 四位转换(string 字符串, int 量)
{
List<string> 输出 = new List<string>();
string 转换 = ""; int 跟 = 0;
do
{
转换 = 金箍插(字符串, 量, 0, 跟++);
foreach (string 元素 in 基本三位转换(转换.Substring(1), 量 - 1))
输出.Add(转换.Substring(0, 1) + 元素);
} while (跟 < 量);
return 输出;
}
static List<string> 五位转换(string 字符串, int 量)
{
List<string> 输出 = new List<string>();
string 转换 = ""; int 跟 = 0;
do
{
转换 = 金箍插(字符串, 量, 0, 跟++);
foreach (string 元素 in 四位转换(转换.Substring(1), 量 - 1))
输出.Add(转换.Substring(0, 1) + 元素);
} while (跟 < 量);
return 输出;
}
string 原始字符串 = "123456", 转换 = 原始字符串;
int 量 = 原始字符串.Length, 跟 = 0;
//Console.Write(string.Join(" ", 四位转换("1234", 4)));
//Console.Write(string.Join(" ", 五位转换("12345", 5)));
do
{
转换 = 金箍插(原始字符串, 量, 0, 跟++);
foreach (string 元素 in 五位转换(转换.Substring(1), 量 - 1))
Console.Write(转换.Substring(0, 1) + 元素 + " ");
Console.WriteLine();
} while (跟 < 量);
之上一个有意思的分解式全排列算法,写到6位为例,更多位的只是写基本相同的代码和不同的命名而已,因此,下一步就是设计出一个循环来重用共同的算法代码,即优化算法,当有大部分重复代码时就该做的事,自然有不同的算法,比如可以把重复的代码写到一个方法中,然后,传递参数进方法去处理,不过接下来该这么写还是未知,看我的思路往哪里想了。