我想通过编辑等于或小于一个数字的距离来生成名称的变体.我认为最简单的解决方案是递归.如果我将当前步骤的结果添加到递归之后,以下代码可以很好地工作;如果我在之前添加它们,则递归无法终止:
def generate_distance1(name):
res = []
# Deletion.
for i in range(len(name)):
if 0 == i:
res.append(name[1:])
elif len(name) - 1 == i:
res.append(name[:-1])
else:
res.append(name[:i] + name[i+1:])
# Substitution.
for i in range(len(name)):
if 0 == i:
res.append("?" + name[1:])
elif len(name) - 1 == i:
res.append(name[:-1] + "?")
else:
res.append(name[:i] + "?" + name[i+1:])
# Addition
for i in range(len(name) + 1):
if 0 == i:
res.append("?" + name)
elif len(name) == i:
res.append(name + "?")
else:
res.append(name[:i] + "?" + name[i:])
res = list(set(res))
return res
def generate_distance(name, max_distance, before):
if 0 == max_distance:
return [name]
dist1 = generate_distance1(name)
if 1 == max_distance:
return dist1
if before:
# This is not OK.
res = dist1
else:
# This is OK.
res = []
for n in dist1:
res.extend(generate_distance(n, max_distance - 1, before))
if not before:
res.extend(dist1)
return list(set(res))
print(generate_distance("abracadabra", 2, before=False))
print(generate_distance("abracadabra", 2, before=True))
我使用的是Python3.11.6.我认为这个问题与词法作用域有关,可能还有闭包,但我不明白为什么;我也不能真正为这个问题制定一个更好的标题.为什么这个递归函数不能终止?