我编写了这段代码,迭代地和递归地在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
我希望一些有经验的程序员可以给我一些关于改进我的代码的反馈!
答案 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))