数据结构(C语言)—— -1递归:全排问题

趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~

全排问题:

输入一个n,输出从1到n的全排列:如输入2,输出1 2和2 1.

#include<stdio.h>
void Display(char a[],int n){
    for(int i=0;i<n;i++){
        printf("%c ",a[i]);
    }
    printf("\n");
}
void swap(char*a,char*b){
	char t;
	t=*a;
	*a=*b;
	*b=t;
}
void perm(char a[],int k,int n){
    if(k==n-1){
        Display(a,n);
    }
    else{
        for(int i=k;i<n;i++){
            swap(&a[k],&a[i]);
            Perm(a,k+1,n);
            swap(&a[k],&a[i]);
        }
    }
}
int main(){
	char a[]="abc";
	Perm(a,0,3);
	return 0;
}

使用递归的方法解决,我们采用的每次进入递归时交换特定的两个元素,然后进入递归,再交换两个特定的元素……出来的时候将元素恢复成原来的位置关系。

那递归出口怎么判定呢?

void perm(char a[],int k,int n){
    if(k==n-1){
        Display(a,n);
    }
    else{
        for(int i=k;i<n;i++){
            swap(&a[k],&a[i]);
            Perm(a,k+1,n);
            swap(&a[k],&a[i]);
        }
    }
}

为了防止交换重复,我们每次交换k~n-1与k位的位置,然后下一次变成k+1……最后到k==n-1时,已经没有东西可以交换了,这时候我们输出结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值