0

再帰を使用してフォローを達成しようとしましたが、segfaultplsを取得すると修正されますか?

セット{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]);
}

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ループに1つの問題が見つかりました。読む必要があります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);

2回目の呼び出しでsumto8は、コメントアウトしていません=。空白とコメント付きのコードがたくさんあります。isVisited()また、現在すべてがコメントされている方法で関数を呼び出すことはありません。関数の最後には、最後にsumto82つの同じreturnステートメントがあります。あなたがそれを少しきれいにしたならば、あなた自身とここにいるみんなの両方が本当に助けになるでしょう。

于 2012-05-04T01:07:04.200 に答える