Python:是否可以混合生成器和递归函数?

Lor*_*ish 5 python recursion generator

有没有办法使下面的代码工作?

add = lambda n: (yield n) or add(n+1)
Run Code Online (Sandbox Code Playgroud)

(答案不需要是功能样式)

pil*_*her 3

def add(n):
    yield n
    for m in add(n+1):
        yield m
Run Code Online (Sandbox Code Playgroud)

使用递归生成器,可以轻松构建复杂的回溯器:

def resolve(db, goals, cut_parent=0):
    try:
        head, tail = goals[0], goals[1:]
    except IndexError:
        yield {}
        return
    try:
        predicate = (
            deepcopy(clause)
                for clause in db[head.name]
                    if len(clause) == len(head)
        )
    except KeyError:
        return
    trail = []
    for clause in predicate:
        try:
            unify(head, clause, trail)
            for each in resolve(db, clause.body, cut_parent + 1):
                for each in resolve(db, tail, cut_parent):
                    yield head.subst
        except UnificationFailed:
            continue
        except Cut, cut:
            if cut.parent == cut_parent:
                raise
            break
        finally:
            restore(trail)
    else:
        if is_cut(head):
            raise Cut(cut_parent)

...

for substitutions in resolve(db, query):
    print substitutions
Run Code Online (Sandbox Code Playgroud)

这是一个由递归生成器实现的 Prolog 引擎。db 是一个字典,代表事实和规则的 Prolog 数据库。unify() 是统一函数,它创建当前目标的所有替换并将更改附加到跟踪中,以便以后可以撤消它们。Restore() 执行撤消操作,is_cut() 测试当前目标是否为“!”,以便我们可以进行分支修剪。