Devy:
私は記述する必要がありrecusive整数recive関数num
戻り方程式の解の数:x1 + x2 + x3 = num
ここで、x1,x2,x3
1-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);
}
これは、模倣剪定との完全なスペースを検索するが、より効率的なソリューションがちょうどを通して検索することができあなたのアプローチx1
とx2
、設定をx3=num-x1-x2
。