【问题标题】:Higher order functions in tree traversal树遍历中的高阶函数
【发布时间】:2014-12-14 07:33:14
【问题描述】:

在传递函数以减少冗余的同时,我如何能够创建常见的树操作,例如插入和搜索。例如,当传入的值大于当前节点时,递归函数在左分支上调用自身。如果我能够传入诸如插入和搜索之类的函数,我就能够排除很多遍历。我看到的主要问题是这两个函数都有不同的基本情况。 python中的示例解决方案将不胜感激。

def insert(n, node = root):
    if node == None:
        node.data = n
        node.left, node.right, node.middle = None
    elif node.data == n:
        insert(node.middle)
    elif node.data < n:
        insert(right)
    else:
        insert(left)


def search(n, node = root):
    if node == None:
        return false
    elif node.data == n:
        return true
    elif node.data < n:
        search(right)
    else:
        search(left)

【问题讨论】:

  • 你自己写过代码吗?
  • 如果您编辑您的帖子并使用代码格式化选项将其粘贴在那里,它会更具可读性;)
  • 它不允许我编辑评论,看起来我已经放入了代码格式化程序,但由于某种原因没有使用。
  • 我的意思是你应该编辑你上面的实际帖子(你原来的问题)并在那里输入代码。您可以在那里格式化代码,使其看起来不错。按“编辑”按钮(在“分享”和“标记”之间)
  • 我修复了我的帖子。如果您有任何想法,请告诉我如何排除最后两个案例。

标签: python recursion functional-programming higher-order-functions tree-traversal


【解决方案1】:

您的插入逻辑不正确。您正在尝试在 None 上设置属性。

为了重用通用代码,您可以使用函数装饰器。在装饰器函数中实现遍历树的通用代码,并在操作函数中对找到的元素执行操作。您可以按如下方式更改代码:

def tree_operation(f):
    def recursive_wrapper(n, node):
       if node == None or node.data == n:
           # tree traversed to final point. do action for found element or
           # None
           return f(n, node)
       # try getting closer to interesting element
       elif node.data < n:
           return recursive_wrapper(n, node.right)
       else:
           return recursive_wrapper(n, node.left)
    return recursive_wrapper

@tree_operation
def search(n, node):
    if node == None:
        return False
    elif node.data == n:
        return True

@tree_operation
def insert(n, node):
    if node == None:
        # this obviously fail
        node.data = n
        node.left, node.right, node.middle = None
    elif node.data == n:
        insert(node.middle)

实际上它传递函数,正如您在问题中指出的那样,并将结果函数重命名为传入函数。上面插入函数的装饰器语法是这样的:

insert = tree_operation(insert)

【讨论】:

    【解决方案2】:

    我认为最好不要将函数的迭代部分组合在一个中,因为它会使代码复杂化。但是如果你认为迭代部分很复杂,需要写一次,你可以重构如下:

    def do_iterate(base_function, n, node=root):
        if node == None or node.data == n:
            base_function(n, node)
        elif node.data < n:
            do_iterate(base_function, n, node.right)
        else:
            do_iterate(base_function, n, node.left)
    

    然后,您可以编写自己的 base_function,该函数将在满足基本条件时调用。例如,您可以使用 base_insert() 和 base_search() 函数来代替 insert() 和 search() 函数。

    def base_insert(n, node):
        if node == None:
            node.data = n
            node.left, node.right, node.middle = None
        else:
            do_iterate(base_insert, n, node.middle)
    
    def base_search(n, node):
        if node == None:
            return false
        else:
            return true
    

    所以您可以使用如下算法:

    do_iterate(base_insert, 7)
    do_iterate(base_search, 4)
    

    最后,我不确定它是否比您的简单代码更好。

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多