2014-04-01 120 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)