“金箍咒”我的全排列组合算法设计演化之三无限嵌套

循环嵌套是非常常用的,之前已经发布写过双循环嵌套的控制变量变形嵌套,在此基础上,演化出无限嵌套算法:

            string 字符串 = "123456789";
            int 量 = 字符串.Length, 跟 = 0, 定 = 3, 嵌套量 = 量 - 定;
            int[] 无限嵌套 = Enumerable.Range(定, 嵌套量).ToArray();
            do
            {
                foreach (int 元 in 无限嵌套)
                {/*逐级运算*/
                    if (元 < 0)
                    {
                        if (跟 + 1 >= 嵌套量) break;/*数组最后元素小于0时*/
                        --无限嵌套[跟 + 1];
                        无限嵌套[跟] = 定 + 跟;
                    }
                    ++跟;
                }
                if (无限嵌套[嵌套量 - 1] >= 0)
                    Console.WriteLine(string.Join(" ", 无限嵌套));
                --无限嵌套[0];
                跟 = 0;
            } while (无限嵌套[嵌套量 - 1] >= 0);


 

            string 字符串 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 输出 = "";
            int 量 = 字符串.Length, 跟 = 量;
            int[] 无限嵌套 = Enumerable.Repeat(0, 量).ToArray();
            do
            {
                while (--跟 >= 0)/*逐级运算*/
                {
                    if (无限嵌套[跟] >= 量)
                    {
                        if (跟 - 1 < 0) break;/*防止越界*/
                        ++无限嵌套[跟 - 1];
                        无限嵌套[跟] = 0;
                    }
                }
                if (无限嵌套[0] < 量)
                    //Console.WriteLine(string.Join(" ", 无限嵌套));
                    foreach (int aa in 无限嵌套)
                        输出 += 字符串[aa].ToString();
                ++无限嵌套[量 - 1];
                跟 = 量;
                Console.WriteLine(输出); 输出 = "";
            } while (无限嵌套[0] < 量);

多年前的想法,今天终于实现了,自动嵌套循环的算法,从此不再局限于固定的嵌套循环,以后都可以使用动态的嵌套循环。2016年1月25日10:05

今天整理算法设计演化过程,只是想留给后人参考;写算法我的原则:从易到难,从最简单的语句到优化算法,写算法是慢工细活,慢慢推演转化的过程,与弹指神功无关,任何弹指神功都不如复制粘贴来的快,弹指神功对写算法有何用?弹指神功对于文章编辑讲求经济效率有关,而与写算法毫无关系,写算法是要分析得快,逻辑推演得快,这只与动脑快有关,该算法自打算自己设计想法起经历约月的构思、调试、演化、优化,这里之所以说些弹指神功的话题,是因为人有个特点,越急越想不出来,越想不出来就越不爱自己想了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值