python - 如何将以下函数变成尾递归函数?

标签 python algorithm recursion binary-tree tail-recursion

我一直在关注 here我正在尝试练习将普通递归函数转换为尾递归函数。我设法理解了斐波那契数列和阶乘的版本,但这一个难倒了我。我了解算法在做什么,以及在转换过程中让我感到困惑的 else 语句。

在 else 中,它会尝试找到一个更接近您正在寻找的数字,然后放弃并使用它发现的小于您建议的数字。

我不确定如何编写使这个尾部递归的辅助函数。对于斐波那契和阶乘,我最终使用了累加器。有没有类似的东西可以用在这里?

class BSTNode(object):
    """Binary search tree node."""

    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

    def __repr__(self):
        return '(%s, %r, %r)' % (self.val, self.left, self.right)

def find_val_or_next_smallest(bst, x):
    """
    Get the greatest value <= x in a binary search tree.
    Returns None if no such value can be found.
    """
    if bst is None:
        return None
    elif bst.val == x:
        return x
    elif bst.val > x:
        return find_val_or_next_smallest(bst.left, x)
    else:
        right_best = find_val_or_next_smallest(bst.right, x)
        if right_best is None:
            return bst.val
        return right_best

我知道 Python 不支持尾递归优化以允许恒定的堆栈空间,但我这样做只是为了在 Python 中练习,因为我喜欢这种语法

最佳答案

而不是做

if right_best is None:
    return bst.val

您可以将迄今为止找到的最佳结果作为额外参数传递给递归调用,并让递归调用处理此检查。

def find_val_or_next_smallest(bst, x, best=None):
    """
    Get the greatest value <= x in a binary search tree.
    Returns None if no such value can be found.
    """
    if bst is None:
        return best
    elif bst.val == x:
        return x
    elif bst.val > x:
        return find_val_or_next_smallest(bst.left, x, best)
    else:
        # bst.val is guaranteed to be the best yet, since if we had
        # seen a better value higher up, the recursion would have gone
        # the other way from that node
        return find_val_or_next_smallest(bst.right, x, bst.val)

关于python - 如何将以下函数变成尾递归函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29761648/

相关文章:

python - 如何在 PySpark 中使用 Scala UDF?

python - 将数组的元素设置为零

python - 用另一个可迭代的值替换可迭代的值到相同的值

Javascript 贪吃蛇游戏 - 递归错误太多

python - Scrapy 蜘蛛显示同一项目中另一个不相关的蜘蛛的错误

java - 如何在我的合并排序实现中发现错误?

java - Baum-Welch 实现示例

java - 使用递归方法计算位数

python - 如何覆盖(或传递)递归函数中的参数?

python - 属性错误 : 'str' object has no attribute 'decode' Python3