修复递归回溯算法代码

时间:2019-05-24 12:32:16

标签: java arrays algorithm recursion backtracking

我需要找到一种使用递归回溯算法的算法,该算法将把所有可能的构图打印到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之间的所有数字)

感谢大家的帮助,如果不清楚的话,我想提供帮助:)

1 个答案:

答案 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