2017-02-27 73 views
1

所以我必須定義一個名爲def factorial_evens(num)的函數:'num'將是任何大於1的數字。我的問題是我必須只使用num中的偶數來計算'num'的階乘。如何在python中找到偶數階乘?

因此,例如,如果num = 6,則階乘將等於48,而不是720。

我當前的代碼僅能夠做定期階乘與偶數輸入,但不會與連做階乘'num'中的數字。

def factorial_evens(num): 
    num = 6 
    if num % 2 == 0: 
     product = 1  
     for i in range(num): 
      product = product * (i+1) 
     print(product) 
+1

只需更換你的循環:'因爲我在範圍(1,NUM,2):' – hashcode55

+0

我很抱歉,但不會是限制範圍到2?編輯:它的工作!你介意解釋一下嗎? –

+0

那麼,如果'num',那麼將不會有輸出? @ hashcode55'range(2,num + 1,2)'? – muru

回答

2

你的條件是錯誤的地點。這看起來像你的嘗試,但應該工作。

def factorial_evens(num): 
    product = 1  
    for i in range(num): 
     if (i % 2 == 1): 
      product = product * (i+1) 
    print(product) 

這將是更好地使用一個箭步範圍內聲明給自己省點力氣

def factorial_evens(num): 
    product = 1 
    for i in range(2, num+1, 2): 
     product *= i 
    print(product) 
+0

你想'範圍內的'num + 1'我相信。 –

1

一個簡單的方法:使用步驟參數range和調節輸入到甚至......

def factorial_evens(num): 
    if num < 0: 
     raise ValueError("argument must be non-negative") 
    if num % 2 == 1: 
     num -= 1 
    result = 1 
    for x in range(num, 0, -2): 
     result *= x 
    return result 

在行動:

In [3]: factorial_evens(6) 
Out[9]: 48 

In [4]: factorial_evens(7) 
Out[4]: 48 

In [5]: factorial_evens(8) 
Out[5]: 384 
1

檢查範圍,過濾奇怪的,減少他們,這裏的功能形式給出:

from functools import reduce 
import operator 
def fact_evens(num): 
    return reduce(operator.mul, filter(lambda x: x%2 == 0, range(1, num+1))) 


fact_evens(6) 
48 

好多了,不過濾,只是在距離跳投2×2:

reduce(operator.mul, range(1, num+1, 2)) 

編輯:爲python2,只需使用reducexrange

+0

這是python 2和OP可能使用Python 3但除此之外的很好的回答 –

+0

奇怪的是要導入functools使用reduce如果python 2正確。無論如何,只是輕微的挑剔。使用'範圍'工作的兩個和給定的大小'num'不應該豬內存... –

+0

對不起,我有一個混合python2-3,虐待編輯解釋 – Netwave