我需要找到一种使用递归回溯算法的算法,该算法将把所有可能的构图打印到x1+x2+x3
上,以等于数字。
假设输入数字为4,所以该方法将向我显示3个结果:
1 1 2
1 2 1
1 1 2
...... 代码:
public class getResult
public static void results(int n)
{
int[] history= new int[3];
results(n,history,0);
}
private static void results(int n,int[] history,int i)
{
if(n==0)
{
printHistory(history,0,i);
System.out.println();
}
if`(n>0&&i<3)`
{
history[i]=1;
//insert 1 to history in order to go back in case of wrong
// way using backtracking.
results(n-1,history,i+1);//calling the function again, with n-1 , backup history, history[i+1]`
history[i]=2;
results(n-2,history,i+1);
history[i]=3;
results(n-3,history,i+1);
//.....9
}
}
private static void printHistory(int[] history,int from,int to)
{
if(from<to)
{
System.out.print(history[from]+"\t");
printHistory(history,from+1,to);
}
}
}
我有2个问题:
1.如何仅打印得出结论x1,x2,x3
的结果。
因为现在,如果我尝试输入num=5
,它将为我显示以下结果:
1 1 3
1 2 2
1 3 1
1 4
2 1 2
2 2 1
2 3
3 1 1
3 2
4 1
5
我想得到仅得出3个数字的结果(例如,没有结果:5、4、1、3、2、2 3)。
2。有没有一种方法可以更好地编写这些行:
history[i]=1;
results(n-1,history,i+1)`;`
是不是每次都复制代码并从数字中手动减去一个数字?(结果应传递1到9之间的所有数字)
感谢大家的帮助,如果不清楚的话,我想提供帮助:)
答案 0 :(得分:0)
对于第二个问题,您只需要提取通用公式并使用循环
private static void results(int n, int[] history, int i) {
if (n == 0 && i == 3) {
printHistory(history, 0, i);
System.out.println();
}
if (n > 0 && i < 3) {
int LIMIT = 4;
int step = 0;
while (step < LIMIT) {
history[i] = ++step;
results(n - step, history, i + 1);
}
}
}
结果
1 1 3
1 2 2
1 3 1
2 1 2
2 2 1
3 1 1