输出数组的全排列

void perm(int list[], int k, int m)
{
    if (    )
    {
        copy(list,list+m,ostream_iterator<int>(cout," "));
        cout<<endl;
        return;
    }
    for (int i=k; i<=m; i++)
    {
        swap(&list[k],&list[i]);
        (    );
        swap(&list[k],&list[i]);
    }
}

解析:

 for (int i=k; i<m; i++)  //初始状态 k=0,m=4; 
    {
        swap(list[k],list[i]); //i从第k个位置开始,一直到第m-1个位置,交换他们的值。假设函数已经执行完i=0了,此时k=0,i=1,交换后list成2134 
        perm(list,k+1,m); 
        //这时候执行函数(作用上面写了):对于数组2134,输出第k+1个位置到第m-1个位置的全排列,即操作(list[1]到list[3]的全排列),也就是此时的list[0] = 2不变,后面三个数134的全排列 
        //而输出134的全排列依然是用到perm函数,再按函数作用来理解,1不变的时候输出34全排列,3不变的时候...4不变的时候...etc 
        //如果递归到k==m,此时第k个位置到第m-1个位置范围不存在,这时候函数就把刚才经过一系列交换操作得到的数组输出
        swap(list[k],list[i]); //经过一系列操作之后得到了以list[1]=2开头的全排列,这个时候交换回来,list还得是原来的list1234,此时i++,再进行list[2]=3作为开头的一系列操作。 
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值