【问题标题】:How to understand the relationship between tail recursion and for loop in DFS如何理解 DFS 中尾递归和 for 循环的关系
【发布时间】:2017-12-26 06:00:20
【问题描述】:

我正在尝试使用 DFS 实现“子集”算法。我发现以下两个程序都有效:

def DFS(nums, begin, path, res):
    res.append(path[:])

    for i in range(begin, len(nums)):
        path.append(nums[i])
        DFS(nums, i + 1, path, res)
        path.pop()


def DFS_2(nums, begin, path, res):
    if begin == len(nums):
        res.append(path[:])
        return

    path.append(nums[begin])
    DFS_2(nums, begin + 1, path, res) #choose the current element
    path.pop()
    DFS_2(nums, begin + 1, path, res) #not choose the current element

测试代码是:

nums = [i for i in range(1, 4)]
res = []
path = []

DFS_2(nums, 0, path, res)
print(res)

res2 = []
DFS(nums, 0, path, res2)
print(res2)

输出是:

DFS_2:[[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]

DFS:[[], [1], [1, 2], [1, 2, 3], [1, 3], [2], [2, 3], [3]]

我可以理解DFS_2,因为在每次递归中,我有两个选择——选择当前元素或不选择当前元素。但是我很难理解函数DFS。如何理解函数DFS 中的for 循环?我的猜测是函数DFS_2中存在尾递归,这就是函数DFSDFS_2相互等价的原因,但我不确定细节。

感谢任何提示。

【问题讨论】:

  • 在不知道您在这些变量(nums、begin、path、res)中实际拥有什么的情况下,我们如何为您提供帮助?
  • 添加了测试代码和输出
  • 我的建议是你拿一张纸,画出正在发生的事情。到时候一切都会清楚得多。

标签: python algorithm recursion depth-first-search


【解决方案1】:

嗯,DFSDFS_2 函数几乎是等价的。是的,在函数 DFS_2 中有两个选择,这很容易看出,但在函数 DFS 中也有相同的两个选择。当程序在 PATH 列表中追加元素时,它正在对该 PATH 进行递归,但是当递归的 branch 结束时,相同的元素被删除从路径开始,然后它开始与以前相同的递归,但 PATH 列表中没有该元素。

如果您在 DFS 函数中每次追加后打印 PATH 列表,输出将是:

('追加后的路径:', [1])

('追加后的路径:', [1, 2])

('追加后的路径:', [1, 2, 3])

('追加后的路径:', [1, 3])

('追加后的路径:', [2])

('追加后的路径:', [2, 3])

('追加后的路径:', [3])

让我们看看,递归从第一个元素开始,并进行了所有可能的排列。之后,进行了相同的递归,但其中没有第一个元素,依此类推,对列表中的所有元素执行相同的操作。总而言之,list 中 i th 元素的每个 递归都会查看其自身之后的所有元素并进行所有可能的排列。开始时第一个元素被放入列表中,然后进行递归,然后放入第二个,然后是第三个,然后递归向下潜入,擦除第三个元素,然后是第二个元素并再次添加第三个元素,但那里不再有第二个元素了。然后第二个元素被擦除,所有排列都为第一个元素完成。所有这些都会发生同样的事情,但正如我所说,列表中 i th 元素的每个 递归只会看到其自身之后的所有元素。

【讨论】:

  • 这正是我需要的“高级”理解。真的很感激!
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多