为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2023-06-27 14:05:52
下面的第一个函数使用该语句实现阶乘函数的递归版本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 * ndef 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()输出:12624120720504040320362880362880039916800479001600479001600预期输出:(与 相同factorial())1262412072050404032036288036288003991680047900160012624120720504040320362880362880039916800479001600
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

您可以使用生成器中的返回值来做到这一点,这就是表达式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 f


for a in factorial2(12):

    print(a)

# 1

# 2

# 6

# 24

# 120

# 720

# 5040

# 40320

# 362880

# 3628800

# 39916800

# 479001600


查看完整回答
反对 回复 2023-06-27
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

您拥有的代码factorial2相当于:


# wrong code, do not use

def factorial2(n):

    if n == 1:

        yield 1

    else:

        for i in factorial2(n - 1):

            yield i * n

我希望你能明白为什么这不起作用。

zip相反,您可以尝试使用和 来从另一方面解决这个问题itertools.count

from itertools import count


def factorial3(n):

    yield 1

    if n > 1:

        yield from (u * i for u, i in zip(factorial3(n - 1), count(2)))


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信