zl程序教程

您现在的位置是:首页 >  其他

当前栏目

简单全排列的逻辑(递归实现)

逻辑递归 实现 简单 排列
2023-09-11 14:18:49 时间

全排列:

将一个包含了N个元素的数组进行所有可能组合的排列。
例如: 问题: 我们将集合a[]={1,2,3}进行排列,如何进行解决?
这里,我们可以运用分治的思路将问题转化为
以下三个新的问题:

  • 1开头的全排列
  • 2开头的全排列
  • 3开头的全排列
    我们利用DFS与回溯的概念,
    当我们分到最后一个字符串数字的时候即可判断是否满足条件!
    ——以此得到下图的概念

在这里插入图片描述
即得到以下6个排列!

1,2,31,3,2
2,1,32,3,1
3,1,23,2,1

题目代码:

#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {//交换函数
	int t = a;
	a = b;
	b = t;
}
void perm(int *data, int index, int end) {
	if (index == end) {//当我分到最后一个数字了,判断条件
		for (int i = 0; i < end; i++)
			printf("%d", data[i]);
		printf("\n");
	}
	else
		for (int i = index; i < end; i++) {//从index 开始 其实枝剪了一部分
			swap(data[i], data[index]);//交换
			perm(data, index + 1, end);//dfs调用
			swap(data[i], data[index]);//复原
		}
}
int main() {
	int data[] = { 1,2,3 };
	perm(data, 0, 3);
	return  0;
}

提示:

如果你不慎一步步带入了步骤且现在被饶了进去不知所踪。
我们利用最少的数字去思考,即1,2两个数字!

  • 1:我们第一步直接走到index==end 输出 1,2;
  • 2:我们还原之后再到下一个循环去 data[1]与data[0]做交换,data[1]与data[1]交换,保持原样,index=2输出,2,1;
#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {
	int t = a;
	a = b;
	b = t;
}
void perm(int *data, int index, int end) {
	if (index == end) {
		for (int i = 0; i < end; i++)
			printf("%d", data[i]);
		printf("\n");
	}
	else
		for (int i = index; i < end; i++) {
			swap(data[i], data[index]);
			perm(data, index + 1, end);
			swap(data[i], data[index]);
		}
}
int main() {
	int data[] = {1,2};
	perm(data, 0, 2);
	return  0;
}