N个数字全排列的分析之我的答案(含分析过程)

继续中文.包括推导过程.

结果可能不严密.我的向来是逐步求精的过程.先说完整的思路

取1~3分析

123 132

213 231

312 321

这个次序是严格的顺序.每次换的时候简单的逆序一个数固定住.后面继续顺序.

如:123顺序  32  逆序 132

再逆序一个 2    13    再逆序一个  231

那么关于顺序和逆序有个规律.可以找.暂时没什么突破口.

如果是穷举那么排列组合算起来第一位有N种可能.第二位用N-1种可能.

我强制规定第一位取1.那么第二位还是剩下了N-1种组合.减少了运算步骤.

剩下一个思路

123   231 312 

132  321 213

这个思路.在汇编里面有个指令.带符号循环位移和不带符号循环位移.符号无所谓.关键在于循环位移

什么是循环位移呢?

123456  向右循环位移1位 612345    右2位 561234

关于循环位移解释到这里.

那么关于1  2  3三个数.循环位移产生两个种子.

1固定    

123 和132  分别产生

123 循环位移  从右开始  312  231

132循环位移 从右开始 213   321      // 标记ABC

到此.三位的全排列完毕

用到

一.固定一个数.1  

二.产生种子.23   32  

三.组合

123   132 分别循环位移

有三位 所以循环位移两次.  其中二是指2 3  1是固定的

推广,四位数.

第一位固定为1.

后面三位数取234的全排列.这个时候2不太好固定了.假设固定了 12   后面全排列则

12  XX  忽略了  13  14几种情况.这个时候结果少了.不行.

如果取前面的标记ABC的6个结果则可能太多了.很可能重复.不轻易用乘法.  //标记DEF

似乎思路没有了.不妨先继续按照少了的思路来.

1固定 取234的全排列

2固定.这个取34的全排列

12  XX   这个反过来

34全排列出来了.34  43加入2

234  243  循环运算

真的是标记ABC地方的6个值.    //234   342   423 | 243  432  324

再加入1

1XXX的全部全排列.

循环运算

结果出来了.

不运算了.

 

方法如下.

对于N

1~N

取N和N-1

全排列

记录

结果和N-2连接 

[  特别说明.这里的连接是   N-2( X X)   ]

循环移位.记录

所有结果再和N-3连接.  [ N-3(XXX) ]

循环位移.记录

所有结果和N-4连接 [ N-4(XXXX)    ]

....

直到和1连接.1(XX....X)

循环位移.输出.所有结果.

代码不敲了.

PS:其实是敲不倒.可能要用到字符串变数字.数字变字符串那个东西.

感谢韩老师的指导.

他的文章地址:http://student.csdn.net/space.php?uid=39102&do=blog&id=5259

用递归还是用循环都可以.

用递归要么规定上界.要么是下界.

用循环就是两个for的问题.

for()   {   for()   }

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值