递归的两个例子——全排列和子集(C++)

一、全排列
我理解全排列的思想就是:一个数组每次都把位于第一的元素拿出与它之后的每一个元素交换,确保每个元素都有机会做当前排列的第一位,再对除此位之外的后面所有元素进行子数组的全排列,依次递归,直到该元素之后没有元素了就一次输出这个被交换好的数列

#include<iostream>
using namespace std;
template<typename T>

void swap(int &a,int &b){
	int c=a;
	a=b; 
	b=c;
} 
//template<typename T>
void f(int *a,int start,int stop){
	//start为全排列的起始位置 
	if(start==stop){
		//已经到了数组最后一位元素
		cout<<"{";
		for(int i=0;i<stop;i++){
			cout<<a[i];
		} 
		cout<<"}";
	}else{
		for(int i=start;i<stop;i++){
			//与第一位的元素交换 
			swap(a[i],a[start]);
			//递归对交换之后a[i]后的元素全排列 
			f(a,start+1,stop);
			//把交换的元素换回来保持数组顺序不变,为下一次交换做准备
			swap(a[i],a[start]); 
			  
		}
	}
}

int main(){
	int a[3]={1,2,3};
	f(a,0,3);
}

运行结果如下:在这里插入图片描述
二、数组的子集
思路:数组里的每个元素对于自己来说都只有两种状态:0代表不在该子集 1代表在该子集,从数组的第一个元素开始都分别以两种状态去组合它之后的元素,如图:在这里插入图片描述在这里插入图片描述
每次以开始元素往后递归0、1两种情况,最后把状态1的显示出来即可`


		//已经到数组的最后一位
		cout<<"{";
		for(int i=0;i<stop;i++){
			if(mark[i]==1){
				cout<<a[i];
			}
		} 
		cout<<"}";
	}else{
		mark[start]=0;
		f(a,mark,start+1,stop);
		mark[start]=1;
		f(a,mark,start+1,stop);
	}
}

int main(){
	char str[3]={'a','b','c'};
	int mark[3];
	f(str,mark,0,3);
}

运行结果如下:在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值