继续中文.包括推导过程.
结果可能不严密.我的向来是逐步求精的过程.先说完整的思路
取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() }