题目:衔接上题,如果不是求字符的所有排列而是求所有字符的组合呢?还是输入三个字符a,b,c,则他们的组合有a,b,c,ab,ac,bc,abc.其中ab和ba只能算一个组合。
分析:组合问题也是可以用递归来解决的。首先,我们先来考虑这样一个问题,从M个不同字符中任取N个字符的所有组合,假设我们要求abc字符中任意两个字符的组合。也就是输入3个字符,求3个字符长度为2的组合。
我们可以这么想。从第一个字符开始(也就是a),第一种情况,这个组合有a,那么剩下就2-1=1个字符和a组合了,要么是b,要么是c,分别组合成ab,ac。第二种情况,这个组合没有a,那么就剩下bc,由于规定的是2个字符的组合,也就只有bc了,这也是整个递归过程结束的条件。示意图如下:
接下来我们再回归题目,要求的是所有字符的组合,也就是组合的长度是1,2,3...,思路其实是一样的,只是多了一个for循环,考虑组合长度1,2,3..多个情况。
void Combination(char *String) { assert(String != NULL); int length = strlen(String); vector<char> result; //for循环对1,2,3...次的组合调用下面的Combination(String, i, result)打印出来 for (int i = 1; i <= length; ++i) Combination(String, i, result); } void Combination(char *pString, int number, vector<char>& result) { assert(pString != NULL); //1.递归出口 if (*pString == '