C++实现全排列

全排列问题。(进一步理解递归的含义,单步运行观察每一个变量的变化)

给定一个数组,求这个数组的全排列。
列如:a={1,2,3,4},对数组a求全排列

结题思路:
将a数组中的元素依次放在第一个位置然,对剩下的元素进行全排列。剩下元素全排列依然是,将剩下的元素依次放在第一个位置,对剩下的元素进行全排列。直到剩下的元素个数为一个时,排列结束。

这里我给出固定元素1,对元素2、3、4进行全排列的一种情况,其他情况类似
在这里插入图片描述
代码

#include<iostream>
using namespace std;
void Swap(int & a, int &b)
{ //将不是第一个元素的元素与第一个元素交互位置
	int t = a;
	a = b;
	b = t;
}
void Perm(int list[], int k, int m)//从第k位到第m位全排列
{
	if (k == m) //当k为最后一个元素时,不用交互了,直接输出。 
	{
		for (int i = 0; i <= m; i++)
			cout << list[i];
		cout << endl;
	}	
	//还有多个元素待排列,递归产生排列
	for (int i = k; i <= m; i++)
	{
		//第一个Swap函数中的 list[k] 一直是指向的待排列序列的第一个位置, list[i]则是待排列序列中的要与第一个位置的元素交互的元素 
		Swap(list[k], list[i]); //交互位置 
		Perm(list, k + 1, m);   // 当上一个Swap交互完成时,然后判断下一个元素 
		Swap(list[k], list[i]); //当上面两个函数调用完成时,将数组还原成最初的形式 
	}
 
}
int main()
{
	int list[] = {1,2,3};
	Perm(list, 0, 2); // 0,2表示0号元素到2号元素做全排列 
	return 0;
}

对于这段核心代码代码:
其中的变量:i始终是要换到第一个位置的元素的下标,变量:k是第一个位置元素的下标

for (int i = k; i <= m; i++)
	{
		//第一个Swap函数中的 list[k] 一直是指向的待排列序列的第一个位置, list[i]则是待排列序列中的要与第一个位置的元素交互的元素 
		Swap(list[k], list[i]); //交互位置 
		Perm(list, k + 1, m);   // 当上一个Swap交互完成时,然后判断下一个元素 
		Swap(list[k], list[i]); //当上面两个函数调用完成时,这个函数执行,将数组还原成最初的形式 
	}

结果:
在这里插入图片描述

总结

递归过程确实比较难理解,大家可以在Excel表中画一下递归过程,这样有助于大家理解整个过程!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Champion.XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值