0

我尝试使用递归来实现以下目标,但我遇到了段错误,请纠正我?

我尝试使用集合 {1,,3,5,7} 的排列解决问题,但未能输出所需的结果以奇数部分打印数字的所有组合,即对于 n = 8:7 + 1
5 + 3
5 + 1 + 1 + 1
3 + 3 + 1 + 1
3 + 1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1

sumto8(a,start,sum1) is://选择关注元素 sumto8(a,start,sum)is://选择关注元素

#include<iostream>
#include<stdio.h>

int sumto8(int*,int,int);
int n=4;
int c=8;

int main()
{
    int a[]={1,3,5,7};
    sumto8(a,0,c);
}

int sumto8(int* a,int start,int sum)
{
   if((sum<0) || (start>(n-1)))
   return -1;

   if(sum==0)
   {
       cout<<" "<<a[start];
       return printf("+ %d",a[start]);
   }
   if(i==-1)
      {
       return-1;
      }
      if(j==-1)
      { 
        return -1
      }




   else
   {
      int sum1=sum-a[start];


      int i=sumto8(a,start,sum1);



      int j=sumto8(a,start+1,sum);
   }

   return printf("+ %d",a[start]);
}

似乎 sum<0 的 if 条件没有正确检查...

output :segfault
4

2 回答 2

2

你说

似乎 sum<0 的 if 条件没有正确检查...

我发现你的检查是这样的

   if((sum<0) && (start>(n-1)))
   return -1;

如果你把“and”改成“or”怎么办

   if((sum<0) || (start>(n-1)))
   return -1;
于 2012-05-04T08:27:41.167 回答
1

我发现 main 中的嵌套 for 循环存在一个问题。它应该是for(int j=0; j<c; j++). 您拥有它,因为j<c+1它会超出您声明的数组范围

编辑:本节还有另一个问题:

    /*dp[start][sum1]=*/sumto8(a,start,sum1);//choosing element of concern 
    start++;
    /*dp[start][sum]*/=sumto8(a,start,sum);

在第二次给你打电话时,sumto8你没有注释掉=. 你有很多空白和注释代码。您也永远不会以isVisited()现在注释所有内容的方式调用该函数,并且在sumto8函数末尾您有两个相同的返回语句。如果你把它清理一下,你自己和这里的每个人都会有帮助。

于 2012-05-04T01:07:04.200 回答