递归--全排列

最近写了很多算法题,遇到了很多关于全排列的问题。在这里我单独讲解一下全排列问题。

1、什么是全排列?

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。用符号p(n,m)表示.

p(n,m)=n(n- 1)(n-2.....-m.+1)= n!/(n-m)!(规定 0!=1).

当m=n时所有的排列情况叫全排列。

2、通过一个实例来理解一下吧

对数组a={1,2,3,4}进行全排列,输出所有排列情况。

public class test {

    static int[] a={1,2,3,4};
    static int count=0;
    public static void main(String[] args){
        f(0);//进入递归
        System.out.println("count="+count);//输出全排列个数
    }
    public static void f(int k){
        if(k==4){//递归返回条件
            for (int i=0;i<4;i++)
                System.out.printf("%d",a[i]);//输出一次排列结果
            count++;//计数
            System.out.println();
        }
        for(int i=k;i<4;i++)//递归
        {
            swap(i,k);
            System.out.printf("before i=%d,k=%d\n",i,k);//可注释掉。用来方便大家理解用的
            f(k+1);
            System.out.printf("after i=%d,k=%d\n",i,k);//可注释掉
            swap(i,k);
        }
    }
    public static void swap(int i,int k){//交换函数
        int t=a[i];
        a[i]=a[k];
        a[k]=t;
    }
    }

在注释掉中间两行的代码后的输出结果:

1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
count=24

答案是24,符合数学计算:4!=4*3*2*!=24

结合这几张图再配上后面这段注解代码带大家理解全排列

不注释时输出结果:

before i=0,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
1234
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
1243
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
1324
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
1342
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
1432
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
1423
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=0,k=0
before i=1,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
2134
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
2143
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
2314
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
2341
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
2431
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
2413
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=1,k=0
before i=2,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
3214
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
3241
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
3124
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
3142
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
3412
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
3421
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=2,k=0
before i=3,k=0
before i=1,k=1
before i=2,k=2
before i=3,k=3
4231
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
4213
after i=3,k=3
after i=3,k=2
after i=1,k=1
before i=2,k=1
before i=2,k=2
before i=3,k=3
4321
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
4312
after i=3,k=3
after i=3,k=2
after i=2,k=1
before i=3,k=1
before i=2,k=2
before i=3,k=3
4132
after i=3,k=3
after i=2,k=2
before i=3,k=2
before i=3,k=3
4123
after i=3,k=3
after i=3,k=2
after i=3,k=1
after i=3,k=0
count=24

进程已结束,退出代码0

大家也可以多试几个数值,多理解一下。

这里为大家列出几个全排列的例题,理解过全排列后可以上手试一下这些题。

凑算法

猜你喜欢

转载自blog.csdn.net/weixin_61936651/article/details/129785920
今日推荐