我正在开发一个相当基本的功能,并且发现很难弄清楚为什么得到输出。
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。我猜想我确实忽略了递归的某些明显部分,感谢您的帮助。
答案 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中找到。堆栈遵循先进先出的规则,因此,当四种方法从堆栈中弹出时,您的打印将以最新的定义开始,并继续以相反的顺序从堆栈中弹出内容。