2015-11-21 4 views
0

Я написал этот фрагмент кода, который реализует двойной факториал в 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

http://codereview.stackexchange.com –

+1

Этот вопрос может быть подходит для [Обзор кода] (http://codereview.stackexchange.com/help), если (а) ваш код работает по назначению, (b) ваш код является реальным кодом, а не примером кода и (c) ваш код включен в тело вопроса. Если вы хотите, чтобы экспертная оценка улучшала все аспекты вашего кода, отправьте ее на обзор кода. – Phrancis

+1

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он принадлежит [codereview.se]. –

ответ

1

Я не очень понимаю, зачем вам нужна переменная VAL, так как она равна N; просто используйте N.

Вы можете написать: , а не 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/

+0

Спасибо за ваш совет! – james42

1
from operator import mul 
semif_pythonic = lambda x: reduce(mul, xrange(x, 1, -2)) 
Смежные вопросы