欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排列组合算法(递归实现)

程序员文章站 2022-05-21 23:18:25
...

全排列(三种实现):

#include<iostream>
#include<algorithm>
using namespace std;

/**
 * 全排列递归实现
 * @param deep 遍历深度
 */
const int perm_end = 10;
int array[] = {1,2,3,4,5,6,7,8,9,10};
int cnt = 0;

void perm_1(int deep) {
	// 递归结束,打印
	if(deep == perm_end) {
		cnt++;
		return ;
	}
	// 递归遍历
	for(int i=deep; i < perm_end; i++) {
		{int temp = array[i]; array[i]=array[deep]; array[deep]=temp;}
		perm_1(deep+1);
		{int temp = array[i]; array[i]=array[deep]; array[deep]=temp;}
	}
} 

bool is_used[perm_end];
int results[perm_end];
void perm_2(int deep) {
    // 递归结束,打印
    if (deep == perm_end) { 
    	cnt++;
        return ;
    	
    }
    // 递归遍历
    for (int i = 0; i < perm_end; i++) {
        if (!is_used[i]) {
            is_used[i] = true;
            results[deep] = array[i];
            perm_2(deep+1);
            is_used[i] = false;
        }
    }
}

int main()
{
	perm_1(0);
	perm_2(0);
	do {
		cnt++;
	} while(next_permutation(array,array+perm_end));
	cout << cnt << endl;
	return 0;
}

组合:

#include <iostream>
using namespace std;

// 组合数个数 
const int M = 2;
// 结果集
int results[M];
// 结果数量
int count =  0;
// 当comb_end == n时结束递归
int comb_end = 0;
// 初始化数组
int array[] = {1,2,3};
// 数组的长度 
const int L = 3;

/**
 * 求组合递归实现
 * @param deep 递归深度
 * @param n 本次递归长度
 * comb_end 数组有效数据下标
 */	
void comb(int deep, int n) {
	// 越界递归结束
	if(deep > L) {
		return ;
	}	
	// 递归结束,打印
	if(comb_end == n) {
		for(int i=0; i < n; i++) {
			cout << results[i] <<  " ";
		}
		cout << endl;
		count++;
		return ;
	}
	// 递归遍历
	results[comb_end++] = array[deep];
	comb(deep+1, n);
	comb_end--;
	comb(deep+1, n);	
}
int main() {
	comb(0,M);
	cout << count << endl;
	return 0;
}