某些递归解决方案只能通过使用引用类型变量(或C / C ++中的指针)或使用全局/成员变量来完成。
我觉得纯粹的递归函数不应该修改全局状态。
这种递归解决方案是否有任何特定的名称(在memoization中,我们只缓存),我们可以将这些转换为更自然的递归类型吗?
例如:二叉树中的最大和问题。
您可以看到我们在通话中使用max[0] = Math.max(max[0]
。
public int maxPathSum(TreeNode root) {
int max[] = new int[1];
max[0] = Integer.MIN_VALUE;
calculateSum(root, max);
return max[0];
}
private int calculateSum(TreeNode root, int[] max) {
if (root == null)
return 0;
int left = calculateSum(root.left, max);
int right = calculateSum(root.right, max);
int current = Math.max(root.val, Math.max(root.val + left, root.val + right));
max[0] = Math.max(max[0], Math.max(current, left + root.val + right));
return current;
}
答案 0 :(得分:2)
全局/参考值完全没必要。它是原始实现(C)的编程语言中的限制的工件,其中返回一对值在语法上是不方便的。
我不太了解Java,知道它是否具有泛型对类,就像C ++那样,但你总是可以使用一个有两个整数成员的类。
尝试使用如下原型重写递归函数:
Pair<int, int> walk(Treenode root, int maxpath);
并且您将看到实际上不需要任何可变变量。