C语言递归实现全排列

全排列:从m个数据中取出n个数据,输出其全部组合的可能性

例如:ABC中取出2个数据,输出其全部可能性

AB

AC

BA

BC

CA

CB

我们将ABC进行编号,并且存放到一个名为used[]的数组中去,在开始时将其赋值为0表示并没有取出任何一个字符

再某一个子符被取出的时候,我们将他的下标对应的used数组置为1

因为只取两个数字,所以我们用i表示,i<=2时候递归结束

1.在每一次递归函数中,我们要遍历整个字符主串,并且判断used数组的值是否为1,如果是1则证明这个字符已经被用过,则取出下一个字符继续进行判断,直到usd数组中的值为0,则尝试放到子串中去

2.此时子串中已经有一个字符,标记这个字符已经被用过,递归调用自己,若递归函数返回,则证明这个子串已经找到一个答案并且输出,进行下一个未用过字符的放置

3.结束条件 i >= 2

代码:

void FullArray(char *source,int sourceLen, int *used, int i,int count,char *dest)
{
	int index = 0;//要对源串进行遍历
	if(i >= count){
		printf("%s\n", dest);//count标示要取出的字符个数,即子串的长度
	}//递归第一就要考虑结束条件
	else{
		for(index = 0; index < sourceLen; index++){//对主串进行遍历
			if(used[index] == 0){//如果主串中的字符没有使用
				dest[i] = source[index];
				used[index] = 1;//标记成已经使用,然后对下一个位置放置字符
				FullArray(source,sourceLen,used,i+1,count,dest);
				//当递归调用返回则证明这个位置放置的字符不正确,则
				used[index] = 0;//清除放置的标志,并且继续选则下一个字符放置
			}
		}
	}
}


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值