検索とX1 + X2 + X3 = NUMにソリューションのNUMを印刷

Devy:

私は記述する必要がありrecusive整数recive関数num戻り方程式の解の数:x1 + x2 + x3 = numここで、x1,x2,x31-10の間の数であり、この方法は、すべてのソリューションを印刷しなければなりません。

たとえば場合num=3、その後の方法は、印刷されます1+1+1と戻ります1

場合num=5の方法は戻ります6と印刷されます:

1 + 1 + 3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1

場合num<3またはnum>30方法が返されます0

この方法は、ループを使用せずに再帰的であるべきです。グローバル変数は許可されていません。リストはまた、許可されていません。

ここに私のコードは、それが正常に動作しますが、のために、それはまた、重複を印刷しnum=5、それを出力します。

3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
2 + 2 + 1
1 + 3 + 1
1 + 2 + 2
2 + 1 + 2
1 + 2 + 2
1 + 1 + 3

ここに私のコードは次のとおりです。

public static void main(String[] args) {
    System.out.println("num of solutions: "+solutions(5));

}

public static int solutions(int num) 
{

    if (num < 3 || num > 30)
        return 0;

    return solutions(num, 1, 1, 1);
}
private static int solutions(int num, int x1, int x2, int x3)
{
    if (x1 < 1 || x1 > 10 || x2 < 1 || x2 > 10||x3 < 1 || x3 > 10)
        return 0;
    if (x1 + x2 + x3 > num)
        return 0;       
    if (x1 + x2 + x3 == num)
    {
        System.out.println(x1 + " + " + x2 + " + " + x3);
        return 1;
    }           
    return solutions(num, x1 + 1, x2, x3) + solutions(num, x1, x2 + 1, x3) + solutions(num, x1, x2, x3 + 1);

}

どのように私は重複せずに所望の出力を得るのですか?

そのほかの男:

あなたは、重複を取得している理由は、両方のことであるsolutions(1,2,1)solutions(2,1,1)にあなたを導くでしょう2 + 2 + 1

3桁のために重複し得ていないの些細な方法は、それは10進数であるかのよう10,10,10に111からカウントアップです。

private static int solutions(int num, int x1, int x2, int x3)
{
  if (x1 > 10 || x1 > num)
    return 0;
  if (x2 > 10 || x1+x2 > num)
    return solutions(num, x1+1, 1, 1);
  if (x3 > 10 || x1+x2+x3 > num)
    return solutions(num, x1, x2+1, 1);

  int me = 0;
  if (x1+x2+x3 == num) {
    System.out.printf("%d + %d + %d\n", x1, x2, x3);
    me=1;
  }
  return me + solutions(num, x1, x2, x3+1);
}

これは、模倣剪定との完全なスペースを検索するが、より効率的なソリューションがちょうどを通して検索することができあなたのアプローチx1x2、設定をx3=num-x1-x2

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=206186&siteId=1
X3