【问题标题】:missed logic in finding sum using recurssion ,got segfault使用递归查找总和时遗漏了逻辑,出现了段错误
【发布时间】:2012-05-04 00:38:13
【问题描述】:

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

我尝试使用集合 {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)是://选择关注的元素

#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

output :segfault

【问题讨论】:

  • 请修正您的代码 sn-p,以免出现几十行难以阅读的空行。
  • 另外,要求陌生人通过检查来发现代码中的错误是没有效率的。您应该使用调试器或打印语句来识别(或至少隔离)问题,然后返回更具体的问题(一旦您将其缩小到 10 行 test-case)。

标签: c recursion


【解决方案1】:

你说

似乎 sum

我发现你的检查是这样的

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

如果你把“and”改成“or”

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

【讨论】:

    【解决方案2】:

    我发现 main 中的嵌套 for 循环存在一个问题。它应该是for(int j=0; j&lt;c; j++)。您将其命名为 j&lt;c+1,它将超出您声明的数组范围

    编辑:这部分还有另一个问题:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 2018-09-10
      • 2016-05-14
      • 2020-05-28
      • 2013-11-24
      相关资源
      最近更新 更多