先看代码:
1 function permgen (a, n) 2 if 0 == n then 3 printResult(a) 4 else 5 for i=1,n do 6 a[n], a[i] = a[i], a[n] 7 permgen(a, n -1) 8 a[n], a[i] = a[i], a[n] 9 end 10 end 11 end 12 13 function printResult (a) 14 for i,v in ipairs(a) do 15 io.write(v, " ") 16 end 17 io.write("\n") 18 end
代码很简单不到20行,由于新手,思考了好久,算是差不多懂了,小记一下。
函数中a表示的是输入的数组,n表示数组中元素个数。
递归终止条件是n=0,这个算法的思想就是:依次将第一个数与最后一个数交换,然后固定,得到前面n-1个数的全排序。printResult函数就是直接输出一个数组。
当n=1时,先将a[1]和a[1]交换,还是自己,接着判断,就输出当前的a;
当n=2时,a:先将a[1]和a[2]交换,将a[1]放到最后固定。
b:此时得到n=1时候的数组,就可以直接输出,结果为a[2] a[1],然后返回。
c: 将a[1]和a[2]的位置换回。
d:for循环继续执行,a[2]和a[2]自身交换,此时数组:a[1] a[2],接着得到n=1,跳转到b:,直接输出a,为a[1] a[2]
当n=3时,也是类似,先将a[1]月a[3]交换,然后固定最后一位,就得到n = 2,以此类推即可。
author:good90