我很难理解基于Java中的递归算法的以下代码。我不明白,x
和y
在彼此调用时有什么不同?我试图通过在代码中调用System.out.print()
来获得正确的值,但仍然没有得到任何帮助。
public class RecursionExample
{
private static int[][] arr={
{3},
{7, 4},
{2, 4, 6},
{8 ,5, 9, 3}
};
public static int maxSum(int[][] graph, int x, int y, int sum) {
if (x == 3)
{
return sum+graph[x][y];
}
int max= Math.max(maxSum(graph, x+1, y, sum), maxSum(graph, x+1, y+1, sum));
sum += graph[x][y];
return sum+max;
}
public static void main(String[] ar)
{
System.out.println(maxSum(arr,0,0,0));
}
}
我不是编程大师,我正在努力学习Java。任何帮助表示赞赏。
答案 0 :(得分:4)
基本上,这会一直调用自己,直到你到达第三次迭代(x==3
)。
所以,这是流量(减去maxSum
中max
的两次调用...为了简单起见)(每个缩进都是对maxSum
的调用):
x = 0
y = 0
sum = 0
x != 3
x = 1
y = 0
sum = 0
x != 3
x = 2
y = 0
sum = 0
x != 3
x = 3
y = 0
sum = 0
x == 3
return 0 + 8 //graph[3][0] == 8
max = 8 //previous return
sum = 0 + 2 //graph[2][0] == 2
return 10 //max + sum == 8 + 2 == 10
max = 10
sum = 0 + 7 //graph[1][0] == 7
return 17
max = 17
sum = 0 + 3 //graph[0][0] == 3
return 20
答案 1 :(得分:1)
您所指的x和y值链接到数字金字塔中的特定数字。
您的算法所做的是通过添加顶部数字,然后将大金字塔分成两个较小的金字塔来找到金字塔下方的最大路径:
{7},
{2, 4},
{8 ,5, 9}
和
{4},
{4, 6},
{5, 9, 3}
然后它对较小的金字塔进行相同的处理(我将使用顶部金字塔进行):
{2},
{8 ,5}
和
{4},
{5, 9}
现在你可以看到,当它打破这些金字塔时,它只剩下2个数字,所以它返回它们。当它爬回堆栈时,它会比较返回的值并返回较大的值。
最终,我们通过强力检查金字塔中的每条路径来达到顶峰。
(顺便说一下,同样的问题在projecteuler.net上)
答案 2 :(得分:1)
理解递归函数的最简单方法是取出铅笔和纸,并写出每一步直到你到达基本情况(在这个等式中,当x == 3时)。然后从那里向后工作,在前面的步骤中插入返回的值。你在这里得到的是头部递归,运行时必须解决每一步并从每一步返回,直到它回到原始调用,到时为止,你得到了答案。
答案 3 :(得分:0)
x和y的值很容易,因为它们是参数 - 只需查看对maxSum的多次调用:首先它们是0和0,在每个下一步x + 1和y + 1(和x) +1和y)上一步,当x到达时停止3.所以做一张桌子,或者更确切地说是树......:
0, 0
1, 1
2, 2
3, 3
3, 2
2, 1
3, 2
3, 1
1, 0
2, 1
3, 2
3, 1
2, 0
3, 1
3, 0
......而且,就是这样!