算法基础--递归2

基础概念:算法基础–递归1

排列生成器:

任务描述:设有集合S={a1,…an},生成该集合中元素的所有排列

容易想到,S的所有排列即ai+S/{ai}的所有情形,这正符合递归形式的定义

下面先用vector传值实现算法:

#include 
#include 
#include 
using namespace std;
void permute(vector &v,size_t k)
{
	if(k==v.size())
	{
		for(size_t i=0;i

但是这种方案效率很低,因为每都要复制转递v的副本,多次函数调用后会造成很大负担,所以我们想到了传引用进去,那么可以直接只改变传值方式吗,答案很显然是不可以的,因为在上面传值的程序中,每次的函数递归调用是不能也不可以改变这个数组,如果使用引用,那么这个数组就被改变,就无法得出正确的结果。下面给出正确的传引用实现:

vector传引用实现算法:

#include 
#include 
#include 
using namespace std;
void permute(vector &v,size_t k)
{
	if(k==v.size())
	{
		for(size_t i=0;i

解决办法也很简单,将数组中的元素换位后想使数组保持不变,显而易见,只要再进行一次换位即可

你可能感兴趣的:(算法)