
1 freeznet 2013-09-05 14:24:05 +08:00 swap(v, n % 2 == 1 ? 0 : i, n - 1); 可以翻成 if( n % 2 == 1 ){ swap(v, 0, n-1) }else{ swap(v, i ,n-1) } 不知道你的是不是... |
3 KMHook 2013-09-06 09:49:22 +08:00 http://blog.csdn.net/honpey/article/details/6904118 注意到: 当n为偶数时,permute()输出全排列后数组元素循环右移一位。 当n为奇数时,permute()输出全排列后数组元素顺序保持不变。 |
4 venson999 OP @KMHook 首先感谢你的回复,有一些疑问,为什么当n为奇数时,permute()输出全排列后数组元素顺序保持不变?以输入[1, 2, 3]为例,会得到如下输出: [1, 2, 3] [2, 1, 3] [3, 1, 2] [1, 3, 2] [2, 3, 1] [3, 2, 1] 数组顺序完全变了,是我这样理解有问题吗? |
5 byelims 2013-09-06 16:49:05 +08:00 关于如何生成全排列我是这么想的。 先从数组中“取”出第一个元素,然后对数组里剩下的元素进行递归调用。 接下来取第二个,递归;取第三个,递归;…… 所以我想关键在于怎么把数组里的元素不重复地取出来? 我的做法是把目标元素先换到数组里的一个固定位置,递归完成后再换回去,恢复原样。 https://gist.github.com/byelims/6461065 至于为什么可以像顶楼那样做,我想你可以看看原始论文。 http://comjnl.oxfordjournals.org/content/6/3/293.full.pdf |