递归的不同风格,参考/全局/指针变量的使用

时间:2015-02-01 06:09:07

标签: java c++ algorithm recursion dynamic-programming

某些递归解决方案只能通过使用引用类型变量(或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;
    }

1 个答案:

答案 0 :(得分:2)

全局/参考值完全没必要。它是原始实现(C)的编程语言中的限制的工件,其中返回一对值在语法上是不方便的。

我不太了解Java,知道它是否具有泛型对类,就像C ++那样,但你总是可以使用一个有两个整数成员的类。

尝试使用如下原型重写递归函数:

Pair<int, int> walk(Treenode root, int maxpath);

并且您将看到实际上不需要任何可变变量。