把一个数组里的数组合全部列出
2015-05-08 11:57
190 查看
题目:给一个数组arr,长度为n,找出从中取出r个数的所有组合。例如对于数组{1, 2, 3, 4} ,r = 2,则打印出:{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4} ,{3, 4}。
来自:http://www.acmerblog.com/combinations-of-r-elements-6059.html
array数组:1 2 3 4 5
下标:0 1 2 3 4
data数组用来保存当前的r个值,index是在data中的下标
1. start=0,end=4,index=0,r==index不成立
data[0]=array[start]=1,向下递归(arr,data ,start+1, end, index+1, r),index和start都加1
(1)start=1,end=4,index=1,r==index不成立
data[1]=array[start]=2,向下递归(arr,data ,start+1, end, index+1, r),index和start都+1
1)start=2,end=4,index=2,r==index不成立
data[2]=array[start]=3
(arr,data ,start+1, end, index+1, r),index和start都+1,start=3,end=4,index=3 .........................(1.1)
a)r==index=3成立
所以将打印出当前data数组中的元素输出0-2下标的值,输出123,然后return到上一步,即回到了1)中(arr,data ,start+1, end, index+1, r)方法
向下执行
(arr,data ,start+1, end, index, r) 函数,start+1,index不变所以start=3,end=4,index=2 ...........................(1.2)
a)r==index(值为2)又不成立
data[2]=array[start]=4
(arr,data ,start+1, end, index+1, r),向下递归 ...........................1.3
A.此时start=4,end=4,index=3,r==index成立,打印出当前data中的值,输出124,然后return到1.3
(arr,data ,start+1, end, index, r) 函数执行 ,start+1=4,index=2
A.start=4,end=3,index=2,r==index不成立
(arr,data ,start+1, end, index+1, r) 向下递归,
r==index成立,输出125,然后return
(arr,data ,start+1, end, index, r) 超出数组下标,return
//============================================================================ // Name : 所有组合.cpp // Author : Coder // Version : // Copyright : www.acmerblog.com // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream>; using namespace std; void print(int arr[],int s,int e){ for(int i=s; i<=e; i++){ printf("%d ", arr[i]); } puts(""); } /* arr[] 输入数组, data[]保存当前的组合 start, end 剩余数组的起始位置 index 已经找到的组合数的个数 r 总共需要的组合数的个数 */ void printAllCombination(int arr[],int data[],int start, int end,int index , int r){ //组合够r个就打印,并返回 if(index == r ){ for(int i=0; i<r; i++) printf("%d ", data[i]); puts(""); return; } //如果剩下的数组不够(r-index)个就直接返回。 if(start + (r-index) > end ) return; data[index] = arr[start];//记录当前数据 printAllCombination(arr,data ,start+1, end, index+1, r); printAllCombination(arr, data,start+1, end, index, r); } int main() { int arr[] = {1,2,3,4,5}; int r = 3; int * data = new int[r];//保持组合数 printAllCombination(arr,data, 0, sizeof(arr)/sizeof(arr[0]) ,0 ,r); return 0; }
来自:http://www.acmerblog.com/combinations-of-r-elements-6059.html
array数组:1 2 3 4 5
下标:0 1 2 3 4
data数组用来保存当前的r个值,index是在data中的下标
1. start=0,end=4,index=0,r==index不成立
data[0]=array[start]=1,向下递归(arr,data ,start+1, end, index+1, r),index和start都加1
(1)start=1,end=4,index=1,r==index不成立
data[1]=array[start]=2,向下递归(arr,data ,start+1, end, index+1, r),index和start都+1
1)start=2,end=4,index=2,r==index不成立
data[2]=array[start]=3
(arr,data ,start+1, end, index+1, r),index和start都+1,start=3,end=4,index=3 .........................(1.1)
a)r==index=3成立
所以将打印出当前data数组中的元素输出0-2下标的值,输出123,然后return到上一步,即回到了1)中(arr,data ,start+1, end, index+1, r)方法
向下执行
(arr,data ,start+1, end, index, r) 函数,start+1,index不变所以start=3,end=4,index=2 ...........................(1.2)
a)r==index(值为2)又不成立
data[2]=array[start]=4
(arr,data ,start+1, end, index+1, r),向下递归 ...........................1.3
A.此时start=4,end=4,index=3,r==index成立,打印出当前data中的值,输出124,然后return到1.3
(arr,data ,start+1, end, index, r) 函数执行 ,start+1=4,index=2
A.start=4,end=3,index=2,r==index不成立
(arr,data ,start+1, end, index+1, r) 向下递归,
r==index成立,输出125,然后return
(arr,data ,start+1, end, index, r) 超出数组下标,return
相关文章推荐
- 把一个数组里的数的组合全部列出
- Q7.1.1 把一个数组里的数的组合全部列出
- 典型的递归问题:把一个数组里的组合全部列出,例如1 2,列出为1,2,12,21
- 把一个数组里的数组合全部列出,比如1 2 列出来为1,2,12,21
- 算法_将一个数组中的数组合全部列出
- 把一个数组中的组合全部列出 [1,2] 1, 12, 2,21
- 把一个数组里的数组合全部列出(递归)
- 把一个数组里的数组合全部列出
- 把一个数组里的组合全部列出
- 将一个数组里面的组合全部列出
- 把一个数组的组合全部列出
- 列出数组中取出的数的全部组合(用递归实现)
- 【数字题2】求一个数组的全部子集
- 将一个数组里面的奇数全部排在前面,偶数排在后面
- 把一个数组里的组合全部列出来.
- javascript中把一个数组的内容全部赋值给另外一个数组
- 利用textbox接收两个数,列出一个数组,并做简单的运算
- 【原创】将一个数组中的0元素全部排到数组的右边,其他元素相对顺序保持不变。
- 算法(输出一个数组中的重复数,(并非全部重复数))
- 求一个数组的全部子集的两种解法