全排列问题

全排列问题--1

**给出一个数字n,求1~n的全排列

下面是c++实现最简单的版本,求1~3的全排列为例

#include<iostream> 
#include<cstdio>
#define max 10 
//对于过程递归来说   在函数的设计过程中这要觉得所需要实现的功能就是这个函数的功能  就可以理所当然的调用自己  不要考虑任何的细节  满足条件即可 
using namespace std;
void f(int *arr,int m,int n)//从m到n的排列
{
	//考虑设计出口问题   
//	m总是不停的在向后游走的,n是长度,所以最后的位置是n-1   m不可能游到n-1之外去吧,所以m又走到n-1位置的时候  
//恰好代表了完成一次全排列的求解   再次声明   不要去考虑细节  整体上合理的就是正确的 
	if(m>n-1){
	// 这就是出口   当m到了n-1的位置时候   表明以某个数为首的全排列计算完成  直接打印即可 
		for(int i=0;i<n;i++){
			cout<<arr[i]<<" ";
		}
		cout<<endl;
	}
	else 
		for(int i=m;i<n;i++){
			//完成交换动作  固定好了第一个数字 
			int temp=arr[m];
			arr[m]=arr[i];
			arr[i]=temp;
			//对剩下的元素进行全排列 
			f(arr,m+1,n) ;
			//再换回来  进行下一次排列 
			temp=arr[m];
			arr[m]=arr[i];
			arr[i]=temp;
			
		}
} 
main(){
	int arr[max];
	int n;
	cin>>n
	for(int i=1;i<=n;i++){
		arr[i-1]=i;
	}
	f(arr,0,n);
}

运行结果如下:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值