C 数组的整数子集之和,获取所有结果而不是第一个结果

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

我的问题很独特。我递归地查找整数数组的幂集,然后我查找数组的和,如果和是我查找的某个数字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];
    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。