C 数组的整数子集之和,获取所有结果而不是第一个结果
我的问题很独特。我递归地查找整数数组的幂集,然后我查找数组的和,如果和是我查找的某个数字N,它应该打印数组并停止执行,但是,在我的情况下,它打印出所有等于该N的子集,而不仅仅是第一个 片段:C 数组的整数子集之和,获取所有结果而不是第一个结果,c,arrays,recursion,sum,powerset,C,Arrays,Recursion,Sum,Powerset,我的问题很独特。我递归地查找整数数组的幂集,然后我查找数组的和,如果和是我查找的某个数字N,它应该打印数组并停止执行,但是,在我的情况下,它打印出所有等于该N的子集,而不仅仅是第一个 片段: void main() { char a; int arr[] = { 1, 4, 15, 20, 1, 1, 2, 3, 66, 14, 33 }; int n = sizeof(arr) / sizeof(arr[0]); int temp[12]; powerS
void main()
{
char a;
int arr[] = { 1, 4, 15, 20, 1, 1, 2, 3, 66, 14, 33 };
int n = sizeof(arr) / sizeof(arr[0]);
int temp[12];
powerSet(arr, temp, n, 0, 0);
scanf("%c", &a);
}
void powerSet(int* arr, int* p, int n, int pos, int index)
{
if (index >= n)
{
return;
}
p[pos] = arr[index];
if (arrSum(0, pos, p, 0) == 100)
{
PrintRec(0, pos, p);
return;
}
else
{
//Most likely an issue here.
powerSet(arr, p, n, pos + 1, index + 1);
powerSet(arr, p, n, pos, index+1);
}
}
void PrintRec(int j, int end, int* p)
{
if (j > end)
{
printf("\n");
return;
}
printf("%d ", p[j]);
PrintRec(j + 1, end, p);
}
阿里苏:
int arrSum(int j, int end, int* p, int sum)
{
if (j > end)
{
return sum;
}
arrSum(j + 1, end, p, sum +=p[j]);
}
我得到的结果是正确的,但我只想要第一个结果。这是因为调用堆栈中充满了
powerset
-函数执行,所有这些函数执行都将结束,每个函数都有机会进入print
,而没有机会检测到它以前被调用过
您可以引入一个“共享计数器”,该计数器在调用print
时递增。共享此计数器,例如,通过引用将其传递给所有调用:
int main() {
int printCounter=0;
powerSet(...., &printCounter);
}
void powerSet(int* arr, int* p, int n, int pos, int index, int *counter) {
...
if(!*counter) { // this block avoids that print will be called more than once
print(...);
(*counter)++;
}
...
powerSet(...., counter);
要强制递归提前结束,可以让
powerSet
函数返回一个布尔值,指示任务已完成。调用PrintRec
后,powerSet
应返回true
,如果任何递归调用返回true
,则调用方应立即返回true
。这将阻止对powerSet
的任何额外调用,并将强制递归堆栈展开
#include <stdbool.h>
bool powerSet(int* arr, int* p, int n, int pos, int index)
{
if (index >= n)
{
return false;
}
p[pos] = arr[index];
if (arrSum(0, pos, p, 0) == 100)
{
PrintRec(0, pos, p);
return true;
}
else
{
if (powerSet(arr, p, n, pos + 1, index + 1))
return true;
if (powerSet(arr, p, n, pos, index+1))
return true;
}
return false;
}
#包括
布尔功率集(整数*arr、整数*p、整数n、整数位置、整数索引)
{
如果(索引>=n)
{
返回false;
}
p[pos]=arr[index];
如果(arrSum(0,位置,p,0)==100)
{
PrintRec(0,pos,p);
返回true;
}
其他的
{
if(动力装置(arr、p、n、位置+1、索引+1))
返回true;
if(动力装置(arr、p、n、pos、索引+1))
返回true;
}
返回false;
}
注意:如果您不允许使用
,则将bool
替换为int
,将true
替换为1
,将false
替换为0
,我认为您缺少arrSum()
。您能显示arrSum
代码吗?行if(arrSum(0,pos,p,0)=100)
对我来说似乎是可疑的,因为从发布的代码中,您使用未初始化的12元素数组调用它,您只在位置pos
显式设置值main
的正确声明是int main(void)
和int main(int-argc,char**argv)
(您将看到使用等效的char*argv[]
编写)。注意:main
是一个int类型的函数,它返回一个值。请参见:。另请参见:我发布了arrSum函数,很抱歉造成混淆,再次说明整个解决方案是正确的,我得到的有效数组的和等于0,但我只想要第一个@pstrjds@DavidC.Rankin我对此无能为力,因为那是真的这就是我的教授教我做的。这个解决方案可能会起作用,但是有没有更优雅的方法来解决这个问题?或者是因为我的函数是按现在的方式构建的?还有,我刚刚被告知我不能这么做。太好了!非常感谢你,这很好。我用int而不是bool。