Python:可以混合使用生成器和递归函数吗?

Python:可以混合使用生成器和递归函数吗?,python,generator,recursion,Python,Generator,Recursion,有没有一种方法可以让下面的代码正常工作 add = lambda n: (yield n) or add(n+1) (答案不需要是函数式的)我不确定“yield(n)或add(n+1)”的意图,但递归生成器肯定是可能的。您可能希望阅读下面的链接,了解可能的情况,特别是标题为“递归生成器”的部分 在我看来,您的函数只是未绑定序列的另一个表达式: n、 n+1,n+2 def add(x): while True: yield x x+=1 for i

有没有一种方法可以让下面的代码正常工作

add = lambda n: (yield n) or add(n+1)

(答案不需要是函数式的)

我不确定“yield(n)或add(n+1)”的意图,但递归生成器肯定是可能的。您可能希望阅读下面的链接,了解可能的情况,特别是标题为“递归生成器”的部分


在我看来,您的函数只是未绑定序列的另一个表达式:

n、 n+1,n+2

def add(x):
    while True:
        yield x
        x+=1

for index in add(5):
    if not index<100: break ## do equivalent of range(5,100)
    print(index)
def添加(x):
尽管如此:
产量x
x+=1
对于add(5)中的索引:
如果不是索引
使用递归生成器,可以轻松构建复杂的回溯器:

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

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

您希望它做什么?给出的add示例没有终止条件。你是有意的吗?
def add(n):
    yield n
    for m in add(n+1):
        yield m
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