【发布时间】:2020-03-19 09:56:57
【问题描述】:
这是我的期中考试题之一。
请跟踪以下程序。修改这个程序,写一个递归程序
int combinations(A, n, k),可以打印出所有的 存储在数组A中的n不同数字中的k数字的组合,附加规则如下:(1)
A[0], A[1], ..., A[n-1]的顺序必须保留并且(2) 这些
k数字的顺序必须是递增的。例如,假设有四个数字
4, 1, 2, 3存储在数组int A[4]中。调用此递归函数combinations(A, 4, 2)将返回计数3 并打印出(1, 2)、(1, 3)和(2, 3),或者调用combinations(A, 4, 3)将返回计数1 并打印出(1, 2, 3)。您的递归程序必须考虑避免不必要的递归函数调用。
老师给出以下代码作为提示:
#include <stdio.h>
#define N 4
int boolfunc(int *var, int m);
int recursivebool(int *var, int n);
int main(){
int varbool[20];
recursivebool(varbool, N);
}
int boolfunc(int *var, int m){
int result=var[0], i;
for (i=1; i<m; i++) result = (result && var[i]);
return result;
}
int recursivebool(int *var, int n){
int localvar[20], i, j;
if (n == 0){
for(i=0; i<N; i++) printf("%d ", var[i]);
printf("%d\n", boolfunc(var, N));
return;
}
for (j=0; j<=1; j++) {
var[n-1] = j;
recursivebool(var, n - 1);
}
}
如果我们运行这个程序,我们可以得到如下输出:
0 0 0 0 0
1 0 0 0 0
0 1 0 0 0
1 1 0 0 0
0 0 1 0 0
1 0 1 0 0
0 1 1 0 0
1 1 1 0 0
0 0 0 1 0
1 0 0 1 0
0 1 0 1 0
1 1 0 1 0
0 0 1 1 0
1 0 1 1 0
0 1 1 1 0
1 1 1 1 1
我可以理解提示程序。我需要使用这个概念来写int combination(int *A, int n, int k),就像问的问题一样。据我所知,如果k 是 2,我可以使用这个概念来找到两个 1 和两个 0 的场景,如下所示:
1 1 0 0
1 0 1 0
1 0 0 1
0 1 1 0
0 1 0 1
0 0 1 1
然后,我们可以从对应的索引 1 中找到数字,并检查这些数字是否按升序排列。
我非常努力地解决了这个问题。但这太难了。
【问题讨论】:
标签: c recursion combinations