用递归实现从M个不同字符中选取N个字符的所有组合

  以前做过类似字符串的题目,当时觉得字符串也能用递归来做非常神奇,后来思考了下,觉得只要抓住字符串是由一个个字符组成的,从第一个字符到最后一个字符每一个都可以作为一次递归,把index作为参数传进去就行,以这种思想为指导才把此题解了出来。 

  对于每个字符只有两种情况,设当前字符串指针为x, 目标字符串指针为y:
  GetString(x,y)= GetString(x+1,y), 不取当前字符
  GetString(x,y) = GetString(x+1,y+1), 取当前字符

  

  
    
1 //////////////////////////////////////////////////////////////////////// //
2   // 递归实现M个字符选N个字符
3   //
4 // param:
5 // origin: original string
6 // oirIndex: index point to original string
7 // M: length of original string
8 // des: destination string
9 // desIndex: index point to des string
10 // N: length of des string
11 //////////////////////////////////////////////////////////////////////// //
12 void GetString( char * origin, int oriIndex, int M, char * des, int desIndex, int N)
13 {
14 if (M < N)
15 return ;
16
17 // output
18 if (strlen(des) == N)
19 {
20 cout << des << endl;
21 return ;
22 }
23 // reach the end of origin or des
24 if (oriIndex == M)
25 return ;
26 if (desIndex == N)
27 {
28 return ;
29 }
30
31 // pick oriIndex
32 des[desIndex] = origin[oriIndex];
33 GetString(origin, ++ oriIndex,M,des, ++ desIndex,N);
34 // not pick
35 des[ -- desIndex] = ' \0 ' ;
36 -- oriIndex;
37 GetString(origin, ++ oriIndex,M,des,desIndex,N);
38 }

 

 

你可能感兴趣的:(递归)