【问题标题】:An implementation for the double factorial双阶乘的实现
【发布时间】:2015-11-21 20:48:06
【问题描述】:

我已经编写了这段代码,它在 Python 中以迭代和递归的方式实现了双阶乘;代码可以正常工作,但我对改进我的整体编程风格很感兴趣。代码如下:

def semif_r(n):                 #recursive implementation
    if n == 0 or n == 1:
        z = 1
    else:
        z= n * semif_r(n-2)
    return z


def semif_i(n):             #iterative implementation
    N = 1
    if n == 0 or n == 1:
        return 1
    elif n%2 == 1:
        for i in range(0,n/2):
            N =  (2*i + 1)*N
            VAL = N
        return n*VAL

    elif n%2 == 0:
        for i in range(0,n/2):
            N =  (2*i+2)*N
            VAL = N
    return VAL

希望有经验的程序员能给我一些改进代码的反馈!

【问题讨论】:

  • 这个问题可能适合Code Review,只要 (a) 您的代码按预期工作,(b) 您的代码是真实代码,而不是示例代码,并且 (c) 您的代码包含在问题的正文中。如果您希望通过同行评审来改进代码的各个方面,请将其发布在 Code Review 上。
  • 我投票结束这个问题,因为它属于Code Review
  • 这个问题现在已经cross-posted on Code Review
  • 大型n 会发生什么,例如n == 2000?

标签: python recursion iteration


【解决方案1】:
from operator import mul
semif_pythonic = lambda x: reduce(mul, xrange(x, 1, -2))

【讨论】:

    【解决方案2】:

    我真的不明白为什么你需要VAL 变量,因为它等于N;只需使用N

    你可以写:N *= (2*i + 1)而不是N = (2*i + 1)*N,但如果你不想用这种方式,也许写N = N * (2*i + 1)会更好,因为它更容易阅读。

    对于算术函数,写n//2而不是n/2,因为两者在Python 3中是不同的;编写n//2 在不同版本的Python 中更便携。

    作为一项挑战,您可能想尝试使用tco 模块将第三个版本编写为尾递归函数:http://baruchel.github.io/python/2015/11/07/explaining-functional-aspects-in-python/

    【讨论】:

    • 感谢您的建议!
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-03-13
    • 2017-03-02
    • 2014-03-24
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多