Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在JS中实现爬楼梯练习的回溯?_Javascript_Dynamic Programming_Backtracking - Fatal编程技术网

Javascript 如何在JS中实现爬楼梯练习的回溯?

Javascript 如何在JS中实现爬楼梯练习的回溯?,javascript,dynamic-programming,backtracking,Javascript,Dynamic Programming,Backtracking,我在函数中实现回溯时遇到问题。我有一个来自代码战的问题 你需要爬一个有n级台阶的楼梯,你决定通过跳上台阶来获得额外的锻炼。一次跳跃最多可跨k步。返回所有可能的跳跃序列,你可以采取爬楼梯,排序 对于n=4和k=2,输出应为: climbingStaircase(n, k) = [[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2]] 我应该以回溯的心态来解决这个问题,但是回溯对我来说是新的,我很难在函数中实现它。我觉得我快到了,但需要一点推动

我在函数中实现回溯时遇到问题。我有一个来自代码战的问题

你需要爬一个有n级台阶的楼梯,你决定通过跳上台阶来获得额外的锻炼。一次跳跃最多可跨k步。返回所有可能的跳跃序列,你可以采取爬楼梯,排序

对于n=4和k=2,输出应为:

climbingStaircase(n, k) = [[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2]]

我应该以回溯的心态来解决这个问题,但是回溯对我来说是新的,我很难在函数中实现它。我觉得我快到了,但需要一点推动。我怎样才能解决这个问题并完全理解回溯呢?

我也遇到了同样的问题,但我解决了。以下是Java的解决方案:

    ArrayList<int[]> solutions = new ArrayList<int[]>();

    int[][] climbingStaircase(int n, int k) {
        climb(new int[n*k], 0, 0, 0, n, k);
        return trimSolution(solutions);
    }

    void climb(int[] sol, int index, int step, int sum, int max, int stepMax) {
        if(step != 0) {
            sum += step;
            sol[index++] = step;
            if(sum < max) {
                // printArray("it: ", sol);
            } else if(sum == max){
                // printArray("sol: ", sol);
                solutions.add(trimSolution(sol));
                sol[--index] = 0;
                return;
            } else {
                sol[--index] = 0;
                // printArray("failed: ", sol);
                return;
            }
        }

        for (step = 1; step <= stepMax; step++) {
            // System.out.println("index: " + index);
            climb(sol, index, step, sum, max, stepMax);
        }
    }

    int[] trimSolution(int[] sol) {
        int length = 0;
        for (int i = 0; i < sol.length; i++) {
            if(sol[i] != 0)
                length++;
        }
        int[] r = new int[length];
        for (int i = 0; i < r.length; i++) {
            r[i] = sol[i];
        }
        return r;
    }

    int[][] trimSolution(ArrayList<int[]> sol) {
        if(sol.size() == 0)
            sol.add(new int[0]);
        int[][] r = new int[sol.size()][1];
        for (int i = 0; i < sol.size(); i++) {
            r[i] = sol.get(i);
        }
        return r;
    }

void printArray(String message, int[] a) {
    System.out.print(message);
    for (int i = 0; i < a.length; i++) {
        System.out.print(a[i] + ", ");
    }
    System.out.println();
}
ArrayList solutions=new ArrayList();
int[][]爬楼梯(int n,int k){
爬升(新整数[n*k],0,0,0,n,k);
返回溶液(溶液);
}
无效爬升(int[]sol,int索引,int步长,int总和,int max,int stepMax){
如果(步骤!=0){
总和+=步长;
sol[index++]=步长;
如果(总和<最大值){
//打印阵列(“it:,sol”);
}否则如果(总和==最大值){
//打印阵列(“溶胶:”,溶胶);
添加(trimSolution(sol));
溶胶[--指数]=0;
回来
}否则{
溶胶[--指数]=0;
//printArray(“失败:”,sol);
回来
}
}

对于(步骤=1;步骤我打赌更好的标题将是一个好的开始?有建议吗?转储代码没有帮助,请解释它。有时,代码只是证明某人有互联网连接;解释表明你自己理解答案,并且足够周到地解释它。