尝试使用递归函数更改通过引用传递的变量?

时间:2019-05-20 19:18:25

标签: python recursion

有更好的方法可以在一棵树上找到一个min,但是我的主要问题是为什么我无法更改记录并在整个跟踪过程中都无法对其进行跟踪。我不想使用全局变量。

record = sys.maxsize
def findMin(tree, record):
        if list(tree.keys())[0] < record:
                record = list(tree.keys())[0]
        if len(tree[list(tree.keys())[0]]) == 0:
                return
        else:
                for v in tree[list(tree.keys())[0]]:
                        findMin(v, record)
findMin({100: [{40: [{34: [{15: []}]}], 56: [{67: [{13: [{9:[]}]}]}], 79: [{92: [{84:[{6:[]}]}]}]}]}
, record)
print(record)

1 个答案:

答案 0 :(得分:0)

在这种问题上,避免全局变量是棘手的。这是使用python的多功能生成器的一种方法-

def find_min (tree):
  # recursively list all keys and values
  def values (t):
    if (isinstance(t, dict)):
      for (k,v) in t.items():
        yield k
        yield from values(v)
    elif (isinstance(t, list)):
      for v in t:
        yield from values(v)
    else:
      yield t
  # find lowest value in iterable
  def min (iter):
    a = inf
    for x in iter:
      if x < a:
        a = x
    return a
  # find lowest value in tree
  return min(values(tree))

在我们的数据树上对其进行测试-

t = {100: [{40: [{34: [{15: []}]}], 56: [{67: [{13: [{9:[]}]}]}], 79: [{92: [{84:[{6:[]}]}]}]}]}

print(find_min(t))
# 6