作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在练习解决递归和回溯练习。我遇到一个问题,要打印列表列表的所有笛卡尔积,其中每个子列表仅包含不同的字符。当然,如果任何一个子列表为空 - 最终产品就是一个空列表。
我立即想到递归\回溯地解决它。我不擅长递归——人们给我的建议是:将递归视为一个黑盒,只考虑一些适当的基本情况,并归纳地假设您已给出 n-1 的答案,并进行递归步骤。
所以这就是我的想法,“基本情况是什么?”当列表列表为空时 - 我将打印一个空列表。如果没有,我返回第一个子列表的第一个字符,再加上对下一个子列表中的列表列表的递归调用。
def cartesian_product(lst):
if len(lst)==0:
return []
for c in cartesian_product(lst[1:]):
for s in c:
return [lst[0][0]] + [s]
我想这里的问题是因为我没有保存当前的子列表,我总是在第一个子列表。但是,出现“NoneType”错误,我不知道为什么。
我如何知道何时需要函数助手?我什么时候可以按照人们告诉我的方式解决这个问题?
最佳答案
首先,虽然这是递归,但我不认为它回溯,因为我们不会组装然后可能拒绝候选解决方案。我们在概念上将空列表视为我们的基本情况,但 Python 的循环逻辑不会在空列表下运行。因此,我们使用两种基本情况,一个空参数列表和一个仅包含单个子列表的参数列表。
如果我们的参数只有一个子列表 [1, 2, 3]
,则结果为 [[1], [2], [3]]
否则,解决方案是将初始子列表的每个成员附加到在其余子列表上递归调用我们自己的结果的前面(副本):
def cartesian_product(array):
product = []
if array: # avoid empty base case
head, *tail = array
if tail: # not a base case
for t in cartesian_product(tail):
for h in head:
product.append([h] + t)
else: # one list base case
product = [[h] for h in head]
return product
此逻辑还为我们提供了所需的行为,即作为任何参数子列表出现的空列表会导致返回空列表作为结果。
关于python - 笛卡尔积 - 使用 BackTracking - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54306081/
我是一名优秀的程序员,十分优秀!