递归函数生成全排列

   

检查n个不同元素的所有排列方式来确定一个最佳的排序。比如a,b,c的排列方式有<<abc,acb,bac,bca,cab,cba>>这六种。

  用c++非递归函数实现比较难,用递归实现还是ok的
  其核心思想是:将每个元素放到n个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去。
  比如:
  a b c
  首先将a放到最前方(跟第一个元素交换),然后排列b c, 然后将a放回本来位置 
   结果 a b c; a c b
  其次将b放到最前方(跟第一个元素交换),然后排列a c,然后将b放回
   结果 b a c; b c a
   。。。

  如果是4个元素,就将元素依次放到第一个元素的位置,后面的排序类似前面的3元素排列


#include <iostream>
using namespace std;

/*
* 函数模板,递归调用对一个数组进行全排列
*/
template <class T>
void Perm(T list[], int k, int m)
{
	int i;
	if (k == m)//输出一个全排列
	{
		for (i = 0; i <= m; i++)
			cout << list[i];
		cout << endl;
	}
	else //list[k:m]有多个排列方式
		//递归的产生这些排列方式
	for (i = k; i <= m; i++)
	{
		swap(list[k], list[i]);//交换位置,a开始与第一个交换位置
		Perm(list, k + 1, m);//下一步就是a后面的与a后面后面的交换位置,知道只有一个数时,就打印
		swap(list[k], list[i]);//从后往前交换,将位置还回去,对下一次排列负责
	}
}


//一个测试程序
int main()
{
	char list[] = "abc";
	Perm(list, 0, 2);
	system("pause");
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值