Python 双阶乘的一种实现

Python 双阶乘的一种实现,python,recursion,iteration,Python,Recursion,Iteration,我已经编写了这段代码,在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): #iter

我已经编写了这段代码,在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

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

我真的不明白为什么需要
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
模块编写第三个版本作为尾部递归函数:

只要(a)您的代码按预期工作,(b)您的代码是真实代码,而不是示例代码,以及(c)您的代码包含在问题主体中,这个问题就可以适用。如果您希望通过同行评议来改进代码的各个方面,请将其发布在代码评议上。我投票将此问题作为主题外的问题结束,因为它属于主题外的问题。此问题现已结束。大型
n
,例如
n==2000
,会发生什么情况?谢谢您的建议!
from operator import mul
semif_pythonic = lambda x: reduce(mul, xrange(x, 1, -2))