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

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);

您会发现实际上不需要可变变量。

【讨论】:

以上是关于不同风格的递归,引用/全局/指针变量的使用的主要内容,如果未能解决你的问题,请参考以下文章

简述static关键字void与void *(void指针)函数指针

1-认识c指针

1-认识c指针

返回指向局部变量的指针或引用

C语言指针/引用/取值

mysql引用并不是指针