全排列递归实现

简介: BFS一般是不会用递归的,而且很不好实现,因为是采用队列机制,而不是栈机 制。但是恰恰好的,递归就是栈机制,所以递归其实就是DFS是栈机制啊,DFS就是栈机制   你要是不用递归,也可以实现DFS,但是要用到栈递归只是使用了一个自动的栈机制   火星十一郎 设R= {r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}。

BFS一般是不会用递归的,而且很不好实现,因为是采用队列机制,而不是栈机
制。
但是恰恰好的,递归就是栈机制,所以递归其实就是DFS
是栈机制啊,DFS就是栈机制

 

你要是不用递归,也可以实现DFS,但是要用到栈
递归只是使用了一个自动的栈机制

 


火星十一郎

设R= {r1,r2,r3,……,rn}是要进行排列的n个元素,Ri=R-{ri}。集合X中的元
素的全排列记为perm(X).(ri)perm(X)表示在全排列perm(X)的每一个排列前加
上前缀ri得到的排列,R的全排列可归纳定义如下:
当n=1,perm(R) = (r) ,其中r是集合R中唯一的元素。
当n>1,perm(R)由(r1)perm(R1),(r2)perm(R2),……,(rn)perm(Rn)构成。

//该算法无法实现重拍,也就是说会重复输出

#include <iostream>
using namespace std;

void swap(int a[], int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

void perm(int a[], int start, int end)
{
int i;
if(start == end)//当k等于m时,表示已经递归到单个元素全排列(基本
部分)
{
for(i = 0; i <= end; i++)
cout << a[i] << " ";
cout << endl;
}
else
{
for(i = start; i <= end; i++)
{
swap(a,start,i);//这里要用到两个swap,是为了不改变在
本函数中a数组中的顺序,而进行下一个循环
perm(a,start + 1,end);
swap(a,start,i);
}
}
}

int main(void)
{

int a[5] = {1,2,3,4,5};
perm(a,0,4);

system("pause");
return 0;
}


#include <stdio.h>
inline void Swap(char& a, char& b)
{// 交换a和b
char temp = a;
a = b;
b = temp;
}

void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++) {
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}

int main()
{
char s[]="123";
Perm(s, 0, 2);
return 0;
}

目录
相关文章
|
5月前
|
存储
全排列问题
全排列问题
20 0
字符串逆序(递归实现)
字符串逆序(递归实现)
88 0
1199:全排列
1199:全排列
175 0
全排列
全排列,
36 0
|
算法 Java
快速幂(非递归)
快速幂(非递归)
字符串逆序(递归和非递归实现)
给连两个指针,left放在字符串左侧,right放在最后一个有效字符位置。 交换两个指针位置上的字符
|
存储 C语言
字符串逆序不一样的解法(递归)
字符串逆序不一样的解法(递归)
101 0
字符串逆序不一样的解法(递归)
|
机器学习/深度学习 人工智能 算法
『递归』汉诺塔和全排列
使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下: 第1步:1号盘从A柱移至B柱第2步:2号盘从A柱移至C柱
216 0