错过了使用递归查找总和的逻辑,得到了段错误

时间:2012-05-04 00:38:14

标签: c recursion

我尝试使用recurssion实现以下功能,但我得到了段错误,请纠正我吗?

我尝试使用set {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)是://选择关注元素 sumto8(a,start,sum)是://选择关注元素

#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]);
}

总和&lt; 0的if条件似乎没有正确检查......

output :segfault

2 个答案:

答案 0 :(得分:2)

你说

  

总和&lt; 0的if条件似乎没有正确检查......

我发现你的检查是这样的

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

如果“和”如何将其更改为“或”

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

答案 1 :(得分: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函数的末尾你最后有两个相同的return语句。如果你把它清理干净的话,如果你自己和这里的每个人都会有所帮助。