这个算法,是把每一个数与末尾的数逐一交换,
k>m 说明已交换完毕,就输出了,这是递归的结束条件。
要学到一定的基本功才能明白。
---------------------------------------------------------------------------
我这个程序,我也编过,放在西祠C++BUILDER论坛里。
你先要掌握,排列的方法才能看懂这个程序。
在这知道里,也答过两次。
为了增加可理解性,我略改了一下方法,我的方法
与你的方法递归方向不同。
http://www.xici.net/d190786398.htm
此算法为递归法显示排列数,没发现比这更简单、明了的递
归算法。此算法只要练智商的作用,没有其它实用价值,阶
乘级的占用时间、空间,数一大,堆栈很快暴了。
算法的要点:
1.列N个数的排列,可化为N个的N-1阶排列:
最末一个数是 D[n-1],把这个位置的N个数的可能性列出,
就是每一个数 与末尾逐一交换位置,就是N种情况,每一种
情况再求N-1的全排列,就是递归调用了;
交换位置后,就调用自已,但必须恢复刚才的交换,以便下一次
交换;
2.当阶数递归到1时,就直接输出这N个数;
public class Main1 {
public static void swap(int a[],int x,int y)
{
int temp=a[x];
a[x]=a[y];
a[y]=temp;
}
/*
* 1、2、3、4
* 第一次:0,3
*
*
*
* */
public static void allsort(int a[],int begin,int end)
{
if(begin==end)
{
System.out.println(Arrays.toString(a));
}
for(int i=begin;i<=end;i++)
{
swap(a,begin,i);
System.out.println("swap第"+i+Arrays.toString(a));
allsort(a,begin+1,end);
System.out.println("allsort"+Arrays.toString(a));
swap(a,begin,i);
System.out.println("swap第"+i+Arrays.toString(a));
}
}
//0、
public static void main(String[] args) {
int a[]={1,2,3,4};
allsort(a,0,a.length-1);
}
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
因为你传入的参数是4,而list数组长度是5,所以要k>m时,才表示获取到一个完整的排列数
你将4改成5的话,就是k==m 了