Умная программа python на основе потоков не сталкивается с бесконечной рекурсией

Я играл с умными способами создания генератора Python для последовательности A003602

Похоже, это работает, но я не могу понять, почему. Мне кажется, что он должен ударить по бесконечной рекурсии. Делает ли python какую-то ленивую оценку где-то, что я не узнаю?

def N():
    i=1
    while True:
        yield i
        i+=1

def interleave(a,b):
    def result():
        x=a()
        y=b()
        while True:
            yield next(x)
            yield next(y)
    return result

def RZ():
    return interleave(N,RZ)()

gen=RZ()

Мне кажется, что, поскольку RZ мгновенно вызывает метод, возвращаемый чередованием, который, в свою очередь, вызывает b, который является RZ (до первого вызова к выходу), это должна быть бесконечная рекурсия. Но на самом деле это, кажется, работает. Может ли кто-нибудь объяснить, почему?

5
задан dspyz 17 June 2012 в 01:31
поделиться