双因子的实现

时间:2015-11-21 20:48:07

标签: 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):             #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

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

2 个答案:

答案 0 :(得分:1)

我真的不明白为什么你需要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/

答案 1 :(得分:1)

from operator import mul
semif_pythonic = lambda x: reduce(mul, xrange(x, 1, -2))