如何使用递归编写在Python中重复调用另一个函数的函数?

如何使用递归编写在Python中重复调用另一个函数的函数?,python,recursion,Python,Recursion,我正在尝试编写一个函数,该函数反复调用另一个函数。这就是我到目前为止所做的: def function1(n, function_object): if n > 0: function_object function1(n-1, function_object) def function2(x, word): for i in range(x): print word y = 'pluto' function1(3, f

我正在尝试编写一个函数,该函数反复调用另一个函数。这就是我到目前为止所做的:

def function1(n, function_object):
    if n > 0:
        function_object
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'

function1(3, function2(3, y))
这是我尝试运行它时得到的结果:

>>> 
pluto
pluto
pluto
>>> 
我原以为它会打印“pluto”九次,但似乎function2只执行一次。如何让它在function1中重复执行?

  • 函数对象后缺少
    ()
  • 调用
    function1
    传递的是
    function2
    的返回值,您应该传递函数对象。我在下面的代码中将其替换为lambda。(在调用
    function1
    之前,使匿名函数调用
    function2

def function1(n,function\u对象):
如果n>0:

函数_object()#在代码中,函数1正在调用自身和另一个函数。不需要那么复杂

另外,在最后一行中,您将
function2(3,y)
作为参数传递-因为这里有parens
()
,它调用function2并获取结果,然后将结果传递给function1。我不认为那是你的本意

所以我修改了它。根据您的要求,这里有一个函数(function1),它调用另一个(任意)函数N次,传递当前值N和任意参数

def function1(n, function_object, *args):
    while n > 0:
        function_object(n, *args)
        n -= 1

def function2(n, x, word):
    for i in range(x):
        print "%s, %d, %d" % (word, n, i)

y = 'pluto'

function1(3, function2, 3, y)
输出:

pluto, 3, 0
pluto, 3, 1
pluto, 3, 2
pluto, 2, 0
pluto, 2, 1
pluto, 2, 2
pluto, 1, 0
pluto, 1, 1
pluto, 1, 2

在这种情况下,Lambdas是一个很好的选择,否则你可以看看这篇文章,他们解释了另外两种制作方法: 执行此操作时:

function2(3, y)
该函数立即运行,其返回值(在本例中为
None
)作为
function\u对象
参数传递到
function1
。在
function1
中,您尝试这样调用它:

function_object
def function1(n, function_object):
    if n > 0:
        function_object()
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'

def function3():
    function2(3, y)

function1(3, function3)
但事实上这并不叫它。因此,在调用function1之前,function2将总共被调用一次

如果将其替换为
function\u object()
,它确实会调用它,但随后会出现一个错误,因为
function\u object
None
,不可调用。要将
function2
传入而不是
None
,只需暂时不要在外部调用它,而是需要执行以下操作:

功能1(3,功能2)

这将导致一个错误,即function2需要接受两个参数,但您没有提供任何参数。因此,下一步是研究如何将这些参数传递给它——这需要在调用它时发生。但是
function1
需要一个没有参数的函数。。您可以通过编写另一个不带参数的函数来解决此问题,并使用所需的两个参数调用
function2
,然后将其传递到function1。看起来是这样的:

function_object
def function1(n, function_object):
    if n > 0:
        function_object()
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'

def function3():
    function2(3, y)

function1(3, function3)
如果您只使用此函数3一次,并且没有合适的名称,则可以使用lambda创建执行相同任务的匿名函数:

def function1(n, function_object):
    if n > 0:
        function_object()
        function1(n-1, function_object)

def function2(x, word):
    for i in range(x):
        print word

y = 'pluto'
function1(3, lambda: function2(3, y))

我想你错过了他想做的事情的要点——将任意函数传递给function1,function1将调用该函数。@jdhildeb,我不认为OP询问的是abitrary参数。这似乎是正确的解决方案,但添加lambda可能是OP当前理解水平的一个巨大飞跃,因此,它需要更多的解释,而不是“这个看起来不同的东西碰巧起作用”。@falsetru:在我看来,OP试图将function2作为参数传递给function1,然后function1应该重复调用function2。他的错误是在最后一行调用函数2,而不是传递它。所以我认为你的lambda在他试图做的事情上贴了墙纸。@jdhildeb,是的,我同意OP的错误是调用
function2
,而不是传递它。抱歉,但我不明白什么是
lambda壁纸。
的意思。标题明确提到了
递归
。没错,但文章顶部的目标是“我正在尝试编写一个重复调用另一个函数的函数”。使用递归实现这一点是没有必要的,这就是为什么我说的“不必那么复杂。”我试图简化解决方案,因为代码越简单越好。