不同风格的递归,引用/全局/指针变量的使用
Posted
技术标签:
【中文标题】不同风格的递归,引用/全局/指针变量的使用【英文标题】:Different flavours of Recursion, Usage of Reference/Global/pointer variables 【发布时间】:2015-02-01 06:09:06 【问题描述】:某些递归解决方案只能通过使用引用类型变量(或 C/C++ 中的指针)或使用全局/成员变量来完成。
我觉得纯递归函数不应该修改全局状态。
这种递归解决方案有什么具体的名称吗(在记忆中,我们只缓存),我们可以将它们转换为更自然的递归类型吗?
例如:二叉树中的最大和问题。
您可以看到我们在调用中使用了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;
【问题讨论】:
【参考方案1】:全局/参考值是完全没有必要的。这是原始实现 (C) 的编程语言限制的产物,其中返回一对值在语法上很尴尬。
我不太了解 Java,不知道它是否有像 C++ 那样的泛型 pair 类,但你总是可以使用一个有两个整数成员的类。
尝试使用如下原型重写递归函数:
Pair<int, int> walk(Treenode root, int maxpath);
您会发现实际上不需要可变变量。
【讨论】:
以上是关于不同风格的递归,引用/全局/指针变量的使用的主要内容,如果未能解决你的问题,请参考以下文章