计算递归调用

时间:2012-01-17 18:44:30

标签: java algorithm recursion

我需要编写一个方法来检查完成网格(2D数组)的可能方式。

网格内部的移动是这样的: 从[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

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

3 个答案:

答案 0 :(得分:1)

每次调用count时都会返回howMany。我想你只需要保存它:

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

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

答案 1 :(得分:0)

如果您已到达阵列末尾(右下角),则返回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 = ...依此类推。
最后,您将得到您想要的呼叫数量。

答案 2 :(得分:0)

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