全排列的递归算法

本文详细介绍了如何使用递归实现数字序列的全排列算法,并通过一个具体的例子进行了展示。文中还提供了一段C语言代码,演示了如何通过交换元素来生成所有可能的排列组合。

分析

对 1 2 3 进行全排列:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
共有六种情况,可以发现:对1 2 3 的全排列可以分成以1为首的全排列、以2为首的全排列、以3为首的全排列三个子问题,而每个子问题又可以分成以其余两个数为首的全排列。把问题转化为规模缩小了的同类问题的子问题,这样一来我们就可以通过递归来解决这个问题了。

代码

#include<stdio.h>
//交换a[i]和a[j]
void swap(int a[],int i,int j){
    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;
}
//将数组a的从第p个q个做全排列 
void perm(int a[],int p,int q){
    int i;
    //递归完成
    if(p==q){
        for(i=0;i<4;i++){
            printf("%d ",a[i]);
        } 
        printf("\n");
    } 
    //从第p到q个全排列
    for(i=p;i<=q;i++){
        swap(a,p,i);
        perm(a,p+1,q);
        swap(a,p,i);
    } 
} 
int main(){
    int a[4]={1,3,4,5};
    perm(a,0,3);
    return 0; 
} 

还有不明白的可以看这个视频:
http://www.tudou.com/programs/view/nnndforCugA/?FR=LIAN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值