2014-04-01 153 views
0

目標是將函數和數字作爲參數傳遞給另一個函數,然後遞歸調用函數n次。我實現了這兩種方式。此版本按預期工作,打印Hello World 3次:Python:傳遞函數並遞歸調用

def do_n(fx, n): 
    if n <= 0: 
     return 
    else: 
     print(fx) 
     do_n(fx, n-1) 

def return_greeting(): 
    return "Hello World" 

do_n(return_greeting(), 3) 

此版本不起作用。它打印Hello World只有一次,然後似乎在第一時間通過後,就失去了被調用函數:

def do_n(fx, n): 
    if n <= 0: 
     return 
    else: 
     fx 
     do_n(fx, n-1) 

def print_greeting(): 
    print("Hello World") 

do_n(print_greeting(), 3) 

有人可以解釋爲什麼第二個版本不print_greeting導致被稱爲3次,打印Hello World 3倍到屏幕?

+2

你可以張貼實際的代碼? '定義'這裏會引發'SyntaxError' ... – mgilson

回答

2

第二個版本不會調用print_greeting三次 - 實際上,兩個版本都不會。

您只需在每個代碼段的最後一行撥打print_greeting一次即可。在這一行中,你調用它,它返回字符串,並且你只需將該字符串傳遞給你的函數do_n函數。

可以進行兩處更改你的第二個片段,使其做你認爲它應該做的事情:

首先,呼叫print_greeting的最後一行。它應該是這樣的:

do_n(print_greeting, 3) 

這樣,你通過實際的功能print_greeting到您的do_n功能。

其次,調用傳遞的函數(現在稱爲fx)是這樣的:在這裏

fx() 

括號表示 「調用這個函數」。

整個片段應該是這樣的:

def do_n(fx, n): 
    if n <= 0: 
     return 
    else: 
     fx() 
     do_n(fx, n-1) 

def print_greeting(): 
    print("Hello World") 

do_n(print_greeting, 3) 
+0

感謝您的徹底迴應。我根據您提供的信息修復了「正在工作」的版本,以便它能夠按照我的意圖書寫。 –

1

聲明fx沒有做任何事情。我想你的意思是說fx()實際上調用該函數。

+0

也可以像'print_greeting'一樣傳遞函數,而不需要parens –

0

在第一個版本中,您將Hello World字符串傳遞給do_n函數並打印n次,這就是爲什麼它只打印n次(實際上您並未調用該函數)。

在第二個版本,你有繩子,但你只是聲明it..If你想這個功能真的叫,你必須爲更改代碼:

def do_n(fx, n): 
    if n <= 0: 
     return 
    else: 
     fx() 
     do_n(fx, n-1) 

def return_greeting(): 
    print "Hello World" 

do_n(return_greeting, 3)