用递归法进行n个数的全排列,思路是怎样的?c++实现

如题所述

比如1,2,3,4 可以变成 2,1,3,4 ,3,12,4 , 4,1,2,3 再把后面134, 12,4 , ,123 ,按同样的方法递归就行了,简单就用几个循环,然后逐次设置一个不等的条件就可以了
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-26
我们先假设要求解这样一个问题:
已知a1,a2,...,an是n个元素的一个序列,命名为Am0,现要求出这n个元素的全排列中与Am0的前m个元素相同的所有序列;
这个问题的解法分两步:
1、将序列Am0的m+1序号上的元素分别与m+1序号及以后的元素交换,得到n-m个新的序列(包括Am0本身),命名为Am0,Am1,Am2,...,Am(n-m-1)。我们认为这个时候这n-m个新序列的m+1序号上的元素已经确定;
2、分别对第1步得到的n-m个新序列求解同样的问题。
即求出n个元素的全排列中与Ami的前m+1个元素相同的所有序列。

现已知这n个数的任意一个序列A。
求n个数的全排列就是求出这n个元素的全排列中与A前0个元素相同的所有序列。本回答被网友采纳

【C++基础】递归进阶之全排列、组合
排列结果为:[1,2]、[1,3]、[2,1]、[2,3]、[3,1]、[3,2]。组合结果则为:[1,2]、[1,3]、[2,3]。针对n个不同元素进行全排列时,如求解n的全排列问题,可以利用递归进行计算。全排列的递归实现如下:例2:求n个数选m个数的全排列,同样可以通过递归实现。组合问题与排列类似,但...

C++中如何编写求出n个数的全排列
n = atoi(c);if(n <= ARRAY_MAX&&n > 0)break;else printf("输入错误,请重新输入:\\n");} } void Start(){ if(count < n){ for(int i = 1;i < n+1;i++){ if(AlreadyHasNum(i))continue;cache[count] = i;count++;Start();count--;\/\/保持每层递归深度的count值一致 } ...

c语言全排列有什么思路?
实现C语言全排列的思路通常采用深度优先搜索(DFS)方法。以递归形式构建,从第一个元素开始,依次尝试与其他元素交换位置,然后递归处理剩余元素。当处理到最后一个元素时,表示完成一次全排列。此过程通过不断回溯,直到所有可能排列组合都生成。以下是基于深度优先搜索的C语言全排列示例代码:c void swap(...

如何理解c++中的“全排列问题”?
全排列问题在C++中主要涉及两种方法进行解决:直接使用深度优先搜索(DFS)回溯法和调用标准库函数std::next_permutation。对于求全排列,直接采用DFS回溯法是一种常见的处理方式。这种方法通过递归地选择剩余元素中的一个进行排列,不断扩展搜索空间,直到找到所有可能的排列。而std::next_permutation函数则提...

(C++)关于全排列--循环移位法,怎么怎么用C++语言实现!
全排列递归法 \/\/字符交换 void Swap(char* a, char* b){ char temp = *a;a = *b;b = temp;} \/\/全排列 void QPL(char* Arr, char* begin){ if (*begin == '\\0')cout << Arr<<" ";else { for (char* p = begin; *p != '\\0'; p++){ Swap(p, begin);QPL(Arr, ...

C++编写程序,输入数n,输出n个字符的全排列,通过函数递归实现。
include <string>#include <vector>#include <iostream>using namespace std;vector<string> do_permutation(string str){ vector<string> res; if (str.size() > 1){ for (size_t i = 0; i != str.size(); ++i){ string sub_str = str.substr(0, i) + str.substr(i...

全排列算法(c++)
这四个可能的头部位置表明,对于字符串的首字符"s[0]",它只能是"a"、"b"、"c"或"d"中的一种,这是全排列的一种情况。如果我们要得到整个字符串的所有排列,可以继续这个思路,递归地处理头部和尾部,直到每个位置都确定。对于"abcd"的例子,通过这个分治过程,我们可以得到24种排列(4乘以3乘以...

全排列的C++实现
template<classType>voidPerm(Typelist[],intk,intm){\/\/产生list[k:m]的所有全排列if(k==m){\/\/只剩一个元素for(inti=0;i<=m;i++)cout<<list[i];cout<<endl;}else\/\/还有多个元素待排列,递归产生排列for(inti=k;i<=m;i++)\/\/循环交换第一个元素与其后的所有元素实现全\/\/排列{Swap...

C++递归代码求助 整数全排列
include <iostream>using namespace std; void display_result(int result[], int n) { for(int i=0; i<n-1;++i) cout<<result[i]<<","; cout<<result[n-1]<<endl;} void display(int a[], int n, int result[], int r_n) { if(n==1) { result[r_n++] ...

请帮小弟用c++写一个全排列递归函数
假设我们求permute(abc)的全排列。permute(abc)的全排列=a+permute(bc)和b+permute(ac)和c+permute(ab)=……….依次类推。所以就可以用递归做。而将abc拆分成a+bc,b+ac,c+ab的过程就是上面的:for(int j=k; j<=m; j++){ Swap(list[k],list[j]);Perm(list, k+1, m);Swap(...

相似回答