基本算法:生成元素数组的所有排列(permute)

static void permute(int[] A, int k){
        //[0, k-1] is prefix, [k, n) is for recursive call;
        if(k==A.length-1){//递归结束条件
            for(int v : A){
                System.out.print(v);
                System.out.print(",");
            }
            System.out.println();
            return;
        }
        
        permute(A, k+1);//递归调用一次;
        
        //将A[k]元素依次与[k+1, n)范围内的每个元素交换,递归
        for(int i=k+1; i<A.length; ++i){
            //swap A[k], A[i]
            int tmp = A[k];
            A[k]=A[i];
            A[i]=tmp;
            
            permute(A, k+1);
            
            //swap back: 交换回来,其实倒也不用,可以直接与A[i+1]交换;
            tmp = A[k];
            A[k]=A[i];
            A[i]=tmp;
        }
    }

    public static void main(String[] args) {
        int[] A = new int[]{1,2,3,4,5};
        permute(A, 0);
    }

测试运行:没有问题。

但是有个正确性证明问题:如何保证循环里的permute(A, k+1);子递归调用语句执行完后,范围[k+1, n)内的元素与递归调用之前相比,没有发生变化呢?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值