“金箍咒”我的全排列组合算法设计演化之二有趣的分解式嵌套

按数量叠加嵌套循环全排列组合算法:

        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位为例,更多位的只是写基本相同的代码和不同的命名而已,因此,下一步就是设计出一个循环来重用共同的算法代码,即优化算法,当有大部分重复代码时就该做的事,自然有不同的算法,比如可以把重复的代码写到一个方法中,然后,传递参数进方法去处理,不过接下来该这么写还是未知,看我的思路往哪里想了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值