使用yield from重构阶乘实现,产生了意想不到的结果

下面的第一个函数使用该语句实现阶乘函数的递归版本yield。


我试图将这yield from句话应用于此factorial(),以便进行实验和学习。因此,我编写了该factorial2()函数,尽管打印了正确的阶乘,但它没有打印所有以前的值,例如factorial().


factorial()我想知道是否有任何方法可以获得与中完全相同的功能factorial2()?


def factorial(n):

    if n == 1:

        yield 1

    else:

        for u in factorial(n - 1):

            yield u

        yield u * n


def factorial2(n):

    if n == 1:

        yield 1

    else:

        yield from (i * n for i in factorial2(n - 1))


def main():

    for u in factorial(12):

        print(u)

    for a in factorial2(12):

        print(a)


if __name__ == '__main__': main()

输出:


1

2

6

24

120

720

5040

40320

362880

3628800

39916800

479001600

479001600

预期输出:(与 相同factorial())


1

2

6

24

120

720

5040

40320

362880

3628800

39916800

479001600

1

2

6

24

120

720

5040

40320

362880

3628800

39916800

479001600


倚天杖
浏览 155回答 2
2回答

桃花长相依

您可以使用生成器中的返回值来做到这一点,这就是表达式yield from最终返回的值:def factorial2(n):    if n == 1:        f = 1    else:        a = yield from factorial2(n - 1)        f = n * a    # Yielded by the generator    yield f    # Returned to `yield from`    return ffor a in factorial2(12):    print(a)# 1# 2# 6# 24# 120# 720# 5040# 40320# 362880# 3628800# 39916800# 479001600

慕尼黑5688855

您拥有的代码factorial2相当于:# wrong code, do not usedef factorial2(n):    if n == 1:        yield 1    else:        for i in factorial2(n - 1):            yield i * n我希望你能明白为什么这不起作用。zip相反,您可以尝试使用和 来从另一方面解决这个问题itertools.count。from itertools import countdef factorial3(n):    yield 1    if n > 1:        yield from (u * i for u, i in zip(factorial3(n - 1), count(2)))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python