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

时间:2018-08-23 17:55:25

标签: python python-3.x

我正在为问题的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:这不是作业问题。 :)

谢谢

1 个答案:

答案 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

请注意,此语法在Python 2中不起作用。必须这样做:

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

与以下相同:

yield from count_to_zero(n-1)