递归输出全排列和全组合

原创 2012年03月21日 13:24:06
// 输出全排列
// author: kennie
#include<iostream>

template<typename T>
void swap(T *, T *);

template<typename T>
void printArr(T [], int len);

template<typename T>
void permutation(T [], int, int, int);

template<typename T>
void swap( T *a, T *b )
{
        T tmp;
        tmp = *a;
        *a = *b;
        *b = tmp;
}

template<typename T>
void printArr( T arr[], int len )
{
        for ( int i = 0; i < len; i++ )
        {
                std::cout << arr[i] << "\t" ;
        }
        std::cout << std::endl;
}

template<typename T>
void permutation( T arr[], int len, int startIndex, int endIndex ) // 递归求解全排列
{
        if ( startIndex > endIndex ) // 递归出口
        {
                printArr( arr, len );
        }
        else
        {
                for ( int j = startIndex; j <= endIndex; j++ ) // 依次交换数组元素与数组首元素
                {
                        swap( &arr[j], &arr[startIndex]);
                        permutation( arr, len, startIndex+1, endIndex ); // 除去当前元素,剩余元素的全排列
                        swap( &arr[j], &arr[startIndex]);
                }
        }
}

int main()
{
        // test
        int intArr [] = { 1, 2, 3 };
        int len = sizeof ( intArr ) / sizeof ( int );

        std::cout << "test int" << std::endl;
        permutation( intArr, len, 0, len-1 );
        std::cout << std::endl;

        char charArr[] = { 'a', 'b', 'c', 'd' };
        int len2 = sizeof ( charArr ) / sizeof( char );

        std::cout << "test char" << std::endl;
        permutation( charArr, len2, 0, len2-1 );
        std::cout << std::endl;

        return 0;
}
// main output as follow:
test int
1       2       3
1       3       2
2       1       3
2       3       1
3       2       1
3       1       2


test char
a       b       c       d
a       b       d       c
a       c       b       d
a       c       d       b
a       d       c       b
a       d       b       c
b       a       c       d
b       a       d       c
b       c       a       d
b       c       d       a
b       d       c       a
b       d       a       c
c       b       a       d
c       b       d       a
c       a       b       d
c       a       d       b
c       d       a       b
c       d       b       a
d       b       c       a
d       b       a       c
d       c       b       a
d       c       a       b
d       a       c       b
d       a       b       c


// 输出全组合

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
using namespace std;

void recursive_combination(char* str, int num, vector<char> & result) // 从n个字符中取m个的组合
{
        if ( num == 0 )
        {
                int length = result.size();
                for ( int i = 0; i < length; i++ )
                {
                        cout << result[i];
                }
                cout << endl;

                return;
        }

        if ( *str == '\0' )
        {
                return;
        }

        result.push_back( *str ); // 取当前字符
        recursive_combination( str+1, num-1, result );

        result.pop_back(); // 不取当前字符
        recursive_combination( str+1, num, result );
}

void combination( char* str, int len )
{
        if ( str == NULL )
        {
                return;
        }

        vector<char> result;
        for ( int i = 1; i <= len; i++ ) // 每一个组合长度
        {
                recursive_combination(str, i, result);
        }
}

int main()
{
        char str[] = {"abcd"};
        int len = sizeof (str) / sizeof (char);
        cout << "src" <<  str << endl;

        cout << "output all combination: " << endl;
        combination(str, len);

        return 0;
}

// main output as follow:
src: abcd
output all combination:
a
b
c
d
ab
ac
ad
bc
bd
cd
abc
abd
acd
bcd
abcd




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

递归输出全部组合数

本文是输出全部的组合数,递归输出全排列可参见:http://blog.csdn.net/prstaxy/article/details/8147029 比如有3个数,1、2、3,则它们的组合有1、2...

C++ 全排列和组合算法(递归)

全排列: 设待排列的数组为a[n],任意时刻将其分为0~s-1和s~n-1两端。 其中,0~s-1是已经选择的区间,s~n-1是待选择的区间,每次选择s~n-1的一个与s为的数交换 #include...

递归实现全排列和组合

用递归实现的全排列,算是一个简单的算法,已经测试通过。其中还考虑了有重复数字的情况,如1,1,3,没有写终端输入,测试时可直接改程序#include #include #define N 3void ...

字符串全排列与全组合的递归实现-Java版

排列组合算法用途广泛, 需要掌握, 为降低门槛, 本文主要关注算法的逻辑和简易性, 未重视算法效率. 结合网络书本上的实现和自己的需求, 这里列有四个目标: 1. 所有元素的全排列: ab的全排列是...

全排列的递归举例详解

  • 2011-10-16 23:16
  • 268KB
  • 下载

递归实现输出n个整数的全排列和所有子集

下面是用c++实现的输出n个整数的全排列# include #include using namespace std; void swap(int &a, int &b) { //交换a和...

去重全排列的递归实现

非递归,按序输出集合的全排列

题目描述 非递归,按序输出集合全排列,是在笔试面试中经常考的问题。递归输出集合的全排列相对来说还是比较简单的,而非递归实现这个问题需要一些小技巧。 全排列是将集合中的元素(可以为数字,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)