我正在为问题的dfs解决方案进行编码。
当我编写如下代码时,在调试时,我发现只要代码 到达self.dfs_solution_rework,而不是递归,它只是继续执行,从而导致错误的结果。
def dfs_solution_rework(self, end, start= 1, sorted=False, num= None):
if not num:
for i in range(1, 10):
self.dfs_solution_rework(end, start, num=i)
elif num <= end:
if num >= start:
yield num
last_digit = num % 10
if not (last_digit == 0 or last_digit == 9):
self.dfs_solution_rework(end, start, num=num * 10 + (last_digit - 1))
self.dfs_solution_rework(end, start, num=num * 10 + (last_digit + 1))
elif last_digit == 0:
self.dfs_solution_rework(end, start, num=num * 10 + 1)
else:
self.dfs_solution_rework(end, start, num=num * 10 + 8)
另一方面,如果我使用util(帮助程序)方法编写dfs,如下所示,则它可以正常工作。
def dfs_solution(self, end, start= 1, sorted=False, num= None):
def dfs_util(end, start, num):
if num <= end:
if num >= start:
print(num)
last_digit = num % 10
if not (last_digit == 0 or last_digit == 9):
dfs_util(end, start, num=num * 10 + (last_digit - 1))
dfs_util(end, start, num=num * 10 + (last_digit + 1))
elif last_digit == 0:
dfs_util(end, start, num=num * 10 + 1)
else:
dfs_util(end, start, num=num * 10 + 8)
for i in range(1, 10):
dfs_util(end, start, num=i)
关于为什么会发生这种行为的任何帮助吗?我已经在VS Code中对其进行了调试,以了解它,但是却一无所知。
PS:这不是作业问题。 :)
谢谢
答案 0 :(得分:1)
递归生成器需要产生递归的结果。
一个与您的问题相同的简化示例将是此递归计数器:
def count_to_zero(n):
yield n
if n == 0:
return
count_to_zero(n-1)
它仅产生一个值:n
。这是因为对count_to_zero(n-1)
的递归调用刚刚创建了一个从未使用过的生成器。
测试:
>>> print(list(count_to_zero(5)))
[5]
这里的解决方案是:
def count_to_zero(n):
yield n
if n == 0:
return
yield from count_to_zero(n-1)
测试:
>>> print(list(count_to_zero(5)))
[5, 4, 3, 2, 1, 0]
例如,对于每个对self.dfs_solution_rework
的递归调用,在您的示例中也都需要做同样的事情。
yield from self.dfs_solution_rework(end, start, num=num * 10 + 1)
请注意,此语法在Python 2中不起作用。必须这样做:
for result in count_to_zero(n-1):
yield result
与以下相同:
yield from count_to_zero(n-1)