除非我使用助手方法,否则递归不会在类中发生

2024-09-28 17:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个问题编写dfs解决方案

当我编写如下代码时,在调试时,我发现每当 到达self.dfs\u solution\u 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(helper)方法编写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代码中调试了它以理解它,但是没有任何想法

附言:不是作业问题。:)

谢谢


Tags: 代码selfifdefutilnotstartnum
1条回答
网友
1楼 · 发布于 2024-09-28 17:22:09

递归生成器需要生成递归的结果

与您的问题相同的简化示例是递归计数器:

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)

Python2

请注意,这个语法在Python2中不起作用

for result in count_to_zero(n-1):
    yield result

与以下内容相同:

yield from count_to_zero(n-1)

相关问题 更多 >