2016-06-12 187 views
0

我寫了一個函數,它將一個正整數n作爲輸入,並遞歸地返回一個階乘值1 !, 2 !,的列表。 。 。 ,n !.功能多次打印

但是,我無法讓它只打印一次。我已經嘗試將打印語句放置在各種循環/位置中,並且始終打印至少3次。我也嘗試過打印函數,但它返回'None',它似乎只打印如果我在函數中有打印語句。爲什麼是這樣?

這裏是我的代碼:

def calc_Factorial(my_list, n, x, e): 

    if not my_list: 
     my_list.append(n-(n-1)) 
     calc_Factorial(my_list, n, x, e) 
    else: 
     if len(my_list) < n: 
      my_list.append(my_list[e]*x) 
      calc_Factorial(my_list, n, x+1, e+1) 

    if len(my_list) == n: 
     print(my_list) 


e = 0 
x = 2 
n = int(input('Enter number: ')) 
my_list = [] 
calc_Factorial(my_list, n, x, e) 
+0

'my_list.append(n-(n-1))':是不是隻有1?另外,爲什麼不直接使用for循環呢?我不知道爲什麼你需要重複一遍又一遍的功能。 – numbermaniac

+0

是的,它會一直是1,不確定爲什麼我這樣寫。這個想法是練習遞歸,而不是僅僅通過for循環來實現,這就是爲什麼它看起來很混亂。 – Perplexityy

回答

1

,因爲你正在使用print遞歸函數內的值正在打印多次。您應該返回,而不是打印的遞歸函數裏面。

def calc_Factorial(my_list, n, x, e): 

    if not my_list: 
    my_list.append(n-(n-1)) 
    return calc_Factorial(my_list, n, x, e) 
    else: 
    if len(my_list) < n: 
     my_list.append(my_list[e]*x) 
     return calc_Factorial(my_list, n, x+1, e+1) 

    if len(my_list) == n: 
     return (my_list) 


e = 0 
x = 2 
n = int(input("Enter number: ")) 
my_list = [] 
print (calc_Factorial(my_list, n, x, e)) 
1

更改打印語句return my_list

def calc_Factorial(my_list, n, x, e): 
    if not my_list: 
     my_list.append(n-(n-1)) 
     calc_Factorial(my_list, n, x, e) 
    else: 
     if len(my_list) < n: 
      my_list.append(my_list[e]*x) 
      calc_Factorial(my_list, n, x+1, e+1) 
    if len(my_list) == n: 
     return my_list 


>>> calc_Factorial(my_list, n, x, e) 
[1, 2, 6, 24, 120, 720, 5040] 
>>> 
1
def calc_Factorial(my_list, n, x, e): 

    if not my_list: 
     my_list.append(n-(n-1)) 
     return calc_Factorial(my_list, n, x, e) 
    else: 
     if len(my_list) < n: 
      my_list.append(my_list[e]*x) 
      return calc_Factorial(my_list, n, x+1, e+1) 

    if len(my_list) == n: 
     print(my_list) 
     return my_list 

關鍵問題這裏是你應該return calc_Factorial(my_list, n, x+1, e+1)每次當你打電話給你recursive。如果你沒有return遞歸,其餘的代碼將被最終執行。這就是爲什麼你看到多個print

只要你在這種情況下調用遞歸返回。你應該總是隻看到一次打印(甚至通過你不return my_list

if len(my_list) == n: 
    print(my_list) 

但通常在遞歸函數,人們只是返回你想要最終值。然而,您可以使用打印服務宗旨,調試。

0

你是什麼看到的是因爲這部分的:

if len(my_list) < n: 
    my_list.append(my_list[e]*x) 
    calc_Factorial(my_list, n, x+1, e+1) 


if len(my_list) == n: 
    print(my_list) 

第一if語句之後,該函數將繼續執行,而現在 n ==可LEN(my_list),因此將被打印的清單。 (實際上這意味着每次調用該函數都會打印一些東西)