2016-02-27 96 views
1

所以問題就這樣產生了,我是新來的Python:無論如何去逆階乘函數?

高清factorial_cap(NUM):對於正整數ñ,n的階乘(記爲ñ!),是產品 從1到n的所有正整數。實現函數返回最小的
正數n使得n!大於或等於參數num。假設:num總是一個正整數。

# Examples 
# factorial_cap(20) output is 4 since 3!<20 but 4!>20 
# factorial_cap(24) output is 4 since 4!=24 
# factorial_cap(1) output is 1 since 1!=1 

# And here is what I got 

def factorial_cap(num): 
    n = 1 
    for i in range (1,num+1): 
     n = n*i  

我很確定這是正確的因子def函數。但我無法弄清楚,而不是獲得'總價值',我怎麼才能得到正確的輸出,正如我上面發佈的例子?

順便說一句,我應該在def結束時使用'return',還是在這種情況下無關緊要?

+0

嘗試在for循環之後使用'return n'。同樣在你的循環中,將'range(1,num + 1)'改爲'range(2,num + 1)',你不必再次乘以1。 – Rolbrok

+0

這是功課嗎? –

+0

@BasSwinckels當然是。 –

回答

2

當需要的數量大於或等於當前總數時,需要進行測試。因此,您可以使用while循環的條件來執行該檢查,並增加一個計數器i,以跟蹤當前迭代。那麼它的返回所產生的值> =所需數量的i當前值的問題:

def factorial_cap(num): 
    n = 1 
    i = 1 
    while n < num: 
     i += 1 
     n *= i 
    return i 

>>> factorial_cap(20) 
4 
>>> factorial_cap(24) 
4 
>>> factorial_cap(25) 
5 
>>> factorial_cap(1) 
1 
>>> factorial_cap(3628800) 
10 
0

如果您可以在解決方案中使用階乘函數,那麼解決方案非常簡單,因爲您可以簡單地檢查第i階乘的大小是否大於num。這裏有一個解決方案:

def fact(num): 
    if num == 0 or num == 1: 
     return 1 
    f = 1 
    for i in range(2, num + 1): 
     f *= i 
    return f 

def fact_cap(num): 
    i = 1 
    while fact(i) < num: 
     i += 1 
    return i 
+0

我只是想指出,無論如何,mhawke的解決方案在性能方面都更好。但另一方面,這是非常直觀的編碼和理解。 – nbro

0

你想一回,但不是n,但i

def factorial_cap(num): 

    n = 1 
    i = 0 

    while True: 

     i += 1 
     n = n*i 
     if n >= num: 
      break 

    return i 

print(factorial_cap(20)) 
print(factorial_cap(24)) 
print(factorial_cap(1)) 
-3

您想在此時使用遞歸,因爲它使您的工作更輕鬆 -

def fact(n): 
    print(factorial(n)) 

def factorial(n): 
    if n==0 or n==1: 
     return 1 
    else: 
     return n*factorial(n-1) 



And sample run for n=5 is: 
>>120 

+5

然而你根本沒有回答這個問題......或者解決問題。 –

+0

@EddoHintoso你在說什麼?代碼有問題嗎? – user2719152

+0

@ user2719152:重點是,我想。你的回答並不回答這個問題。你的答案是階乘函數的遞歸實現,然而,OP請求了階乘函數(種類)的倒數,即給出了一些數字,它是產生它的'factorial(n)'中的'n'。 – mhawke