递归函数(基本)

时间:2019-03-17 12:59:22

标签: python recursion

我正在开发一个相当基本的功能,并且发现很难弄清楚为什么得到输出。

def mystery(n):    
    print(n)     
    if n < 4:     
        mystery(n + 1)    
    print(n)        

mystery(1)

这是我的输出:

1
2
3
4
4
3
2
1

我想我在输出的第一部分很清楚,n <4,所以我们每次加1,然后当我们到4时,该函数会跳过if部分并再次打印print(n),即4。然后,我有点迷茫,尽管为什么输出计数会回落到1。我猜想我确实忽略了递归的某些明显部分,感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

每次mystery(n + 1)完成时,将调用下一个print(n)

也许下面的代码更清晰:

def mystery(n):
    print('\t' * n + 'enter mystery ' + str(n))
    if n < 4:
        print('\t' * n + 'before mystery(n+1) ' + str(n))
        mystery(n + 1)
    print('\t' * n + 'after mystery ' + str(n))

mystery(1)

输出:

enter mystery 1
before mystery(n+1) 1
    enter mystery 2
    before mystery(n+1) 2
        enter mystery 3
        before mystery(n+1) 3
            enter mystery 4
            after mystery 4
        after mystery 3
    after mystery 2
after mystery 1

答案 1 :(得分:1)

将其视为调用树:

mystery(1)
  print(1) - first print
  mystery(1 + 1 = 2)
    print(2) - first print
    mystery(2 + 1 = 3)
      print(3) - first print
      mystery(3 + 1 = 4)
        print(4) - first print
        print(4) - second print
      print(3) - second print
    print(2) - second print
  print(1) - second print

每次都调用该函数的第一张图,显示数字递增。但是一旦达到4,该函数便不再调用自身(这是“终止条件”),然后调用树开始展开。在n = 4的情况下,它将跳过再次调用mystery()并进行打印。然后,函数返回到上一个调用(之前为mystery(3),打印,然后退出)。一直进行到所有东西都解开并且程序退出为止。

答案 2 :(得分:0)

只是为了帮助OP可视化正在发生的事情,几个打印语句可以显示代码的实际流程如何:

def mystery(n):    
    print(f"First print: {n}")
    if n < 4:
        print(f"n < 4 == True, n: {n}")
        mystery(n + 1)
    else:
        print(f"n < 4 == False, n: {n}")
    print(f"Second print: {n}")

mystery(1)

输出:

First print: 1
n < 4 == True, n: 1
First print: 2
n < 4 == True, n: 2
First print: 3
n < 4 == True, n: 3
First print: 4
n < 4 == False, n: 4
Second print: 4
Second print: 3
Second print: 2
Second print: 1

答案 3 :(得分:0)

由于print(n)的位置,它发生在for if语句之后。同样,由于它是该函数的一部分,因此每次调用该函数时都会打印。但是,由于您已调用该函数四次,因此它将击中该打印语句四次。我感谢它打印并降序排列的原因是,每次调用该方法时,它都会添加到全局执行上下文堆栈中。使用简单的图表最容易理解堆栈,该图表可以在递归函数部分in this document中找到。堆栈遵循先进先出的规则,因此,当四种方法从堆栈中弹出时,您的打印将以最新的定义开始,并继续以相反的顺序从堆栈中弹出内容。