关于全排列递归算法

2025-02-26 05:34:54
推荐回答(3个)
回答1:

这个算法,是把每一个数与末尾的数逐一交换,
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个数;

回答2:

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);
    }

回答3:

int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);

因为你传入的参数是4,而list数组长度是5,所以要k>m时,才表示获取到一个完整的排列数
你将4改成5的话,就是k==m 了