繁体   English   中英

了解递归函数调用

[英]Understanding recursive functions calls

考虑以下代码:

def print_mah(n):
    if n <= 0:
        return
    else:
        print('mah') 
        print_mah(n-1) 

print_mah(3)

在这里,Python检查n是否小于或等于0,它发现这是False,因此它打印'mah'并用n-1调用相同的函数,直到n等于0,因此'mah'被打印3次。

但是,请考虑以下操纵代码:

def print_mah(n):
    if n <= 0:
        return
    else: 
        print_mah(n-1)
        print('mah')

print_mah(3)

Python检查n是否小于或等于0,它发现这是False,因此再次用n-1调用同一函数,并且'mah'也被打印3次。

我的问题是,为什么不一次打印'mah',换句话说,为什么不使用n = 2调用print_mah,然后Python发现条件为False ,所以用n = 1进行调用,并找到条件为False ,因此它以n == 0进行调用,并发现条件为True ,因此该函数返回,并且在打印'mah'之后仅返回一次。

要了解不同之处,这可能会有所帮助。

算法1

def print_n(n):
    if n <= 0:
        return
    else:
        print_n(n-1)
        print(n)

算法2

def print_n(n):
    if n <= 0:
        return
    else:
        print(n)
        print_n(n-1)

这些算法应提供不同的结果,也许这是进一步研究的良好起点。

一些帮助

如果在另一个函数(f1)中调用一个函数(f2),则当前函数(f1)将等待,直到被调用函数(f2)完成。

一些研究关键词

  • 函数调用

Python发现条件为False,因此以n = 1对其进行调用,并发现条件为False,因此以n == 0对其进行调用,并发现该条件为True,因此该函数返回

这实际上是第二个版本的确切执行路径。 但是,也许您看不到,当函数返回时,它会像递归调用一样返回在递归调用返回从中断处恢复的位置。

因此,当n==1 ,并将它与递归n==0 ,那么它被返回和mah被印刷在第一次,则该返回和mah当打印n==2 ,然后返回并mah被印刷的第三和最后的时间。

这两个函数将打印mah 3次,因为在递归调用之后您没有返回任何内容。 当您在内部调用函数时,应该处理停止条件(您在第一个if条件中已经执行过),然后在此之后它不会退出程序,因为递归调用会生成一系列操作。 在最后一个操作停止后(返回某项),然后它将在返回的递归调用下方开始编译该函数的其余部分,直到到达该函数的末尾。

return不会破坏整个调用堆栈,而不会破坏当前的函数调用。 在这种情况下:

def print_mah(n):
  if n <= 0:
      return
  else: 
      print_mah(n-1)
      print('mah')

print_mah(3)

在返回0之前, print_mah被调用了3次。您可以认为它们只是嵌套的逻辑,如下所示:

def print_mah(n):
  if n <= 0:
      return
  else: 
      print_mah(n-1) # Replace this line with new call
      print('mah')

我们只是在注释的else语句内再次调用该函数。

def print_mah(n):
  if n <= 0:
      #return
  else:
      n = n-1
      if n <= 0:
          #return
      else: 
          print_mah(n-1)
          print('mah')
      print('mah')

您会看到print('mah')依次显示在底部,正如所写的那样,当函数从调用堆栈中回退时,它将顺序打印。

这是第二个程序正在做的“跟踪”:

print_mah(3) ->
  print_mah(2) ->
    print_mah(1) ->
      print_mah(0) ->
        # Does nothing, essentially.
        <-
      # print_mah(1) continues running.
      print('mah')  # The last thing that print_mah(1) does.
      <-
    # print_mah(2) continues running.
    print('mah')
    <-
  # print_mah(3) continues running.
  print('mah')
  <-

我们在这里看到的是print('mah')出现了3次(因此,'mah'被打印了3次)。

我的问题是为什么不一次打印'mah',换句话说为什么不使用n = 2调用print_mah,然后Python发现条件为False,所以用n = 1进行调用,并找到条件为False,因此以n == 0进行调用,并发现条件为True,因此该函数返回,并且在打印“ mah”后仅返回一次。

该函数仅返回最内部的函数。 在调用print_mah并实际打印之后,使用else条件的两个功能级别将继续执行。 为简便起见,这是print_mah(2)的逐行浏览。

print_mah(2)
# Enter print_mah - Level 1

    if n <= 0: # n = 2
        # ...
    # False, continue to else

    else: 
        print_mah(n-1)  # n = 2
    # Enter print_mah - Level 2

        if n <= 0: # n = 1
        # ...
        # False, continue to else

        else: 
            print_mah(n-1)  # n = 1
        # Enter print_mah - Level 3

            if n <= 0: # n = 0
                return
            # Return None to print_mah - Level 2

        print('mah')
        # Function is complete, return None to print_mah - Level 1

    print('mah')
    # Function is complete, return None to the execution scope

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM