全排列的递归实现
2010-03-31 11:25
260 查看
#include <stddef.h>
#include <iostream>
using namespace std;
template<typename T>
void swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
// 递归实现全排列, P(n) = R1P(R1)+...+RnP(Rn).
// RiP(Ri)- 以Ri开头的全排列
// beg: 起始位置(从0开始)
// end: 终止位置的下一个位置(超出终点位置)
// 返回所有排列数
template<typename T>
size_t perm(T arr, size_t beg, size_t end)
{
static size_t n = 0;
if(beg == end){ // only one elem
for(size_t i = 0; i < end; ++i)
std::cout << arr[i] << " ";
std::cout << std::endl;
++n;
}
else{
for(size_t i = beg; i != end; ++i){
swap(arr[beg], arr[i]);
perm(arr, beg+1, end);
swap(arr[beg], arr[i]);
}
}
return n;
}
int main()
{
int test[] = {5,3,6,7};
size_t n = perm(test, 0, 4);
std::cout <<"Total: " << n << std::endl;
getchar();
return 0;
}
#include <iostream>
using namespace std;
template<typename T>
void swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
// 递归实现全排列, P(n) = R1P(R1)+...+RnP(Rn).
// RiP(Ri)- 以Ri开头的全排列
// beg: 起始位置(从0开始)
// end: 终止位置的下一个位置(超出终点位置)
// 返回所有排列数
template<typename T>
size_t perm(T arr, size_t beg, size_t end)
{
static size_t n = 0;
if(beg == end){ // only one elem
for(size_t i = 0; i < end; ++i)
std::cout << arr[i] << " ";
std::cout << std::endl;
++n;
}
else{
for(size_t i = beg; i != end; ++i){
swap(arr[beg], arr[i]);
perm(arr, beg+1, end);
swap(arr[beg], arr[i]);
}
}
return n;
}
int main()
{
int test[] = {5,3,6,7};
size_t n = perm(test, 0, 4);
std::cout <<"Total: " << n << std::endl;
getchar();
return 0;
}