试题:组合的模板非递归实现
2012-02-08 12:33
260 查看
#include <cassert> #include <vector> #include <iostream> using namespace std; template <typename T> void show(const vector<T> & element, const vector<int> & index) { assert(index.size() > 0); assert(element.size() >= index.size()); for (int i = 0; i < index.size(); ++i) { cout << element[index[i]] << " "; } cout << endl; } template <typename T> void select(const vector<T> & element, int n, vector<int> & index) { if (n <= 0 || n > element.size()) { return; } index.clear(); for (int i = 0; i < n; ++i) { index.push_back(i); } while (true) { while (index[n - 1] <= element.size() - 1) { show(element, index); ++index[n - 1]; } int index_bound = element.size(); int carry_index = n - 2; while (carry_index >= 0) { ++index[carry_index]; --index_bound; if (index[carry_index] < index_bound) { break; } else { assert(index[carry_index] == index_bound); --carry_index; } } if (carry_index >= 0) { for (int i = carry_index + 1; i < n; ++i) { index[i] = index[i - 1] + 1; } } else { break; } } } template <typename U, typename V> void combine(U begin, U end, V * pfirst) { vector<V> element(begin, end); vector<int> index; index.reserve(element.size()); for (int i = 1; i <= element.size(); ++i) { select(element, i, index); } } template <typename T> void combine(T begin, T end) { combine(begin, end, &*begin); } int main() { int data[] = { 1, 2, 3, 4, 5, 6 }; combine(data, data + sizeof(data) / sizeof(data[0])); combine(data, *(&data + 1)); return 0; }
相关文章推荐
- java 排列组合(递归实现)
- c++ 递归实现不同字母的全排列组合
- 字符串数组元素排列与组合的Java递归实现
- 两两组合算法-递归实现方法
- 12个字母任选5个进行排列组合,不可重复 javascript 递归实现
- 递归实现排列组合问题
- VB.NET版机房收费之模板方法实现组合查询
- 从数组中取出n个元素的所有组合(递归实现)
- 排列与组合的Java递归实现 (参考)
- 组合算法的递归实现
- 基于递归思想的组合、H变换等几个算法实现
- 递归实现排列组合问题
- 模板方法模式实现组合查询
- 递归实现数字排列组合
- 求n的阶乘(递归&&非递归),Fibonacci函数,二分法查找,汉诺塔实现,排列组合,整数划分,一元多项式的加减乘
- 类对象引用计数使用模板实现(奇特的递归模板模式)
- 使用 Lambda 表达式编写递归三:实现 Y 组合子
- 递归实现数字排列组合
- java 递归 实现数字的排列组合
- 用递归实现排列组合(java代码)