【问题标题】:Counting in recursion calls计算递归调用
【发布时间】:2012-01-17 18:44:29
【问题描述】:

我需要编写一个方法来检查有多少种可能的方式来完成一个网格(一个二维数组)。

网格内部的运动是这样的: 从 [0][0] 开始,取其中的数字(例如 14),然后转到
[array.[0][0]%10][array.[0][0]/10][array.[0][0]/10][array.[0][0]%10]

对于我们的示例: [1][4][4][1]

直到到达数组的末尾(右下角)。

我可以到达数组的末尾(所有可能的方式) - 我的问题是计算我实际完成数组的次数 - 我不能在方法之外使用变量,并且方法必须是递归的.

这是代码:

private static int howMany(int[][] array, int y, int x, int count) {
    if(y+(array[y][x]%10) < array.length && x+(array[y][x]/10)< array[y].length && array[y][x]!=0) {
        System.out.println("["+y+"]["+x+"] is: "+array[y][x]);
        howMany(array, y+(array[y][x]%10), x+(array[y][x]/10),count);
    }
    if(y+(array[y][x]/10) < array.length && x+(array[y][x]%10)< array[y].length && array[y][x]!=0) {
         System.out.println("["+y+"]["+x+"] is: "+array[y][x]);
         howMany(array, y+(array[y][x]/10), x+(array[y][x]%10),count);
    }
    if(y==array.length-1 && x==array[y].length-1) count++;
    return count;  
}

这显然是错误的,并且会返回最初的计数,我尝试了许多其他方法但无济于事...... 这是完整的类(带有要测试的数组):

link to full class

编辑:非常感谢大家的帮助!

【问题讨论】:

    标签: java algorithm recursion


    【解决方案1】:

    count 已经从对howMany 的每次调用中返回。我想你只需要保存它:

    count = howMany(array, y + (array[y][x] % 10), x + (array[y][x] / 10), count);
    

    在两个 if 块内执行此操作。我在您的链接代码中进行了此更改并得到了预期的结果 (3)。

    【讨论】:

    • 谢谢,我用过这个(主要是改动少,呵呵)
    【解决方案2】:

    您已经在正确的轨道上,因为您的方法签名返回一个 int。您应该定义一个变量来保存计数,为主要递归调用增加它,并将递归方法本身的结果添加到它。将计数传递给每个递归调用是不必要的,应该删除。

    【讨论】:

      【解决方案3】:

      如果到达数组的末尾(右下角)则返回 1,否则返回 1+howMany(array, newY, newX)。您不需要每次都保留计数并通过它。该功能将这样工作:
      1 + returned value of 2nd call =
      1 + 1 + returned value of 3rd call =
      1 + 1 + 1 + returned value of 4th call =... 等等。
      最后,您将获得所需的调用次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多