递归问题与独特的解决方案

时间:2014-04-19 20:02:19

标签: java recursion unique

出于好奇,我写了一个程序来计算产生一定分数的不同数量的滑雪球角色组合。这些孔的值为[0,10,20,30,40,50,100],它们作为枚举值保存。还有九个球卷。我将每个卷处理为递归调用下一个卷,同时循环遍历每个卷的值:

private static void scoreCalc(int targetScore, int score, int ballNumber)
{
    for(SkiBallHoles hole : SkiBallHoles.values())
    {
        score += hole.getValue();
        ballNumber--;
        if (ballNumber > 0) {
            scoreCalc(targetScore, score, ballNumber);
        }
        if (ballNumber == 0 && score == targetScore) {
            frequency++;
        }
        ballNumber++;
        score -= hole.getValue();
    }
}

分数本身从主函数中的for循环传递给此函数,进入一系列设置函数:

while(score <= 900){
    writer.println(calculateFrequency(score));
    score += 10;
}

private static String calculateFrequency(int targetScore)
{
    frequency = 0;
    scoreCalc(targetScore);
    return targetScore + ": " + frequency;
}

private static void scoreCalc(int targetScore)
{
     scoreCalc(targetScore, 0, BALLCOUNT);
}

这种方法的问题在于,不计算唯一解决方案的数量。即,0 0 0 0 0 0 0 0 10被计为与10 0 0 0 0 0 0 0 0不同,而它们实际上是相同的值组合以产生分数。

如何修改我的方法以仅计算唯一解决方案?

谢谢=)

2 个答案:

答案 0 :(得分:1)

通过按值对洞进行排序,您只能对已排序的解决方案(0 0 0 0 0 0 0 0 100 0 0 0 0 0 0 10 20等)进行迭代。

您的解决方案是否针对同一个孔的不同排列进行迭代? (即0 0迭代两次)如果是这样,你可以将结果除以n!。然而,这种方法会更慢。

答案 1 :(得分:0)

谢谢@ omer681,你指出了我正确的方向。

我的修复涉及将数值中的孔值从枚举更改为整数。然后,在递归中,传递'itter'int,其中for循环将开始。在递归中,此数字是从for循环继承的。这样,for循环中的每个步骤都将限制下面循环中的步骤数。这适用于任意数量的球和刻痕孔。

    private static void scoreCalc(int targetScore, int score, int ballNumber,
    int itter)
{
    for(int i = itter; i < HOLEVALUES.length; i++)
    {
     ...
     if (ballNumber > 0) {
         scoreCalc(targetScore, score, ballNumber, i);
     ...
    }
}

private static void scoreCalc(int targetScore)
{
    scoreCalc(targetScore, 0, BALLCOUNT, 0);
}