Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Recursion 如何将递归解重写为迭代解_Recursion_Iteration - Fatal编程技术网

Recursion 如何将递归解重写为迭代解

Recursion 如何将递归解重写为迭代解,recursion,iteration,Recursion,Iteration,问题来自OJ。 说明如下: 我们在玩猜谜游戏。游戏内容如下: 我从1到n中选择一个数字。你得猜我选了哪个号码。 每次你猜错了,我都会告诉你我选的数字是高还是低。 然而,当你猜到一个特定的数字x,你猜错了,你就要付x美元。当你猜到我选的号码时,你就赢了。 给定一个特定的n≥ 1、找出你需要多少钱才能保证一场胜利 我写了一个关于递归中最小最大值问题的小片段。但是它很慢,我想用迭代的方式重写它。谁能帮我一下,告诉我如何将递归解转换为迭代解?任何想法都值得赞赏。代码如下所示: public int

问题来自OJ。 说明如下: 我们在玩猜谜游戏。游戏内容如下: 我从1到n中选择一个数字。你得猜我选了哪个号码。 每次你猜错了,我都会告诉你我选的数字是高还是低。 然而,当你猜到一个特定的数字x,你猜错了,你就要付x美元。当你猜到我选的号码时,你就赢了。 给定一个特定的n≥ 1、找出你需要多少钱才能保证一场胜利

我写了一个关于递归中最小最大值问题的小片段。但是它很慢,我想用迭代的方式重写它。谁能帮我一下,告诉我如何将递归解转换为迭代解?任何想法都值得赞赏。代码如下所示:

   public int getMoneyAmount(int n) {
        int[][] dp = new int[n + 1][n + 1];
        for(int i = 0; i < dp.length; i++)
            Arrays.fill(dp[i], -1);
        return solve(dp, 1, n);
    }
    private int solve(int[][] dp, int left, int right){
        if(left >= right){
            return 0;
        }
        if(dp[left][right] != -1){
            return dp[left][right];
        }
        dp[left][right] = Integer.MAX_VALUE;
        for(int i = left; i <= right; i++){
            dp[left][right] = Math.min(dp[left][right], i + Math.max(solve(dp, left, i - 1),solve(dp, i + 1, right)));
        }
        return dp[left][right];
    }

通常,您可以使用一些重点概念进行转换:

用while循环或for循环替换递归,前提是您可以预先确定在这种情况下可以执行的迭代次数。 在循环中,检查递归的终止条件;当你击中其中一个时,跳过循环的其余部分。 维护局部变量以替换参数和返回值。 循环终止是整个问题的完成。在您的情况下,这将填充整个dp阵列。 循环体由当前在递归步骤中的计算组成:为递归调用准备参数。 通常的方法是通过一个嵌套的二维循环来填充数组,从最简单的情况左=右开始,一直到最远的角落左=1,右=n。注意,你的主对角线是0,在你进入循环之前初始化它,你的下三角是未使用的,甚至不用麻烦初始化它

对于循环体,您应该能够推导出如何填充每个后续对角线,在每个迭代中,从刚才的迭代中缩短一个元素。赋值语句就是主体。在这种情况下,您不需要递归终止条件:返回0的条件是您在初始化中涉及的条件;另一个你从来没有打过,用你的循环指数左右控制


这些提示足以让你行动起来吗?

请澄清你到底想做什么。这看起来像是多维数组的复杂舞蹈,但如果没有进一步的澄清或内联注释,我就不知所措了。