在Java中实现和修复递归方法

时间:2014-02-06 04:08:06

标签: java recursion

    public boolean generateProblems(Integer[] nums, int start) {

    if (start == nums.length) {
        return false;
    }

    for (int i = -range; i < range; i++) {
        nums[start] = nums[start] + i;
        System.out.println(printArray(nums));
        Target game = new Target(nums, target);
        if (game.solutionSize() == difficulty) {
            if (!possibleGames.contains(game.getValues())) {
                possibleGames.add(game.getValues());
            }
            return false;
        }

        if (generateProblems(nums, start + 1)) {
            return true;
        }
        nums[start] = nums[start] - i;

    }

    return false;

}

概述:在游戏中,24,你必须加,减,除,乘四个数才能到达目标,24。我有一个类似的,更抽象的类叫做Target,它取一个整数和数组(并且解决了达到给定目标值的解决方案。

我有另一个名为TargetGenerator的类,它接受“种子数组”,目标值,范围和请求的解决方案数量(难度)。它应该做的是调用方法 generateProblems ,以获得可能的游戏列表,以便此组合仅包含难度解决方案。这些可能的游戏受初始种子数组加上/减去范围的限制。 (种子,{2,3,4,5}范围为3,范围为{-1,0,1,2},但不包括{5,6,7,8}。)

然而,我遇到的问题是我没有血腥的想法为什么这不起作用。 。打印出在控制台中尝试的组合表示它开始正常,但结果不是很好。

种子为{6,2,3,12},目标为24,范围为3:

2 2 3 12 
2 -2 3 12 
2 -2 -1 12 
2 -2 -1 8 
2 -2 -1 9 
2 -2 -1 10 
A few more lines later is where it messes up...
2 1 1 12 
2 1 1 13 
2 1 2 10 
2 1 2 6 
2 1 2 7 
2 1 3 7 
....Few hundred more combinations later...
9 -1 -23 -46 
9 -1 -23 -45 
9 -1 -23 -44 
9 -1 -23 -43 
....And now I'm sad :(

在我看来,当它到达“循环”结束时(当start == nums.length时)会发生什么问题,并且当它不应该减去它时会减去。但是,我没有调试技巧来弄清楚什么是错误的。

(如果你们想要的话,我会给出完整的代码)

1 个答案:

答案 0 :(得分:1)

我希望它已经不相关了,你自己解决了它,但如果不是,我发现你的功能错了。据我了解,如果您能够达到目标数量,您只需要在给定范围内检查所有可能的组合。如果是这样,你真的不需要从generateProblems中返回任何东西(你可以,但是这样做只会增加复杂性),你只需要检查所有的组合。这就是你如何做到的:

public void generateProblems(Integer[] nums, int start) 
{

    if (start != nums.length) 
    {
        for (int i = -range; i < range; i++) 
        {
            nums[start] = nums[start] + i;

            action(nums);
            generateProblems(nums, start + 1);         

            nums[start] = nums[start] - i;
        }
    }
}

action(nums);内部是你的逻辑