我无法直观地看到递归函数中实际发生的事情。我已经尝试绘制激活帧并跟踪数据流,但我一路上都迷路了。 PythonTutor.com的可视化工具并没有像我希望的那样多。
这是一个使用递归确定数字中位数的函数。
def digits(x):
if x > 0:
return 1 + digits(x // 10)
else:
return 0
为什么1只能从一个激活帧“幸存”到另一个激活帧?
答案 0 :(得分:2)
因此,如果我考虑x = 20
,流程将如下:
End: result = 2 <-----------.
| +
Start: digits(20) ==> returns 1 <-----------.
+ | +
digits(2) ==> returns 1 <-----------.
+ |
digits(0) ==> returns 0
答案 1 :(得分:0)
使用递归,从基本情况开始通常很有用。你可以很容易地在纸上完成它。
digits(0)
x = 0
if x > 0 # false
return 0
digits(0) == 0
digits(1)
x = 1
if x > 0 # true
return 1 + digits(1 // 10)
return 1 + digits(0) # 1//10==0
return 1 + 0 # digits(0)==0
return 1
digits(1) == 1
...
digits(10)
x = 10
x > 0 # true
return 1 + digits(10 // 10)
return 1 + digits(1)
return 1 + 1
return 2
digits(10) == 2
等等。
答案 2 :(得分:0)
以数字(10)为例:
digits(10):
if 10 > 0:
return 1 + digits(10 // 10)
<==>return 1 + digits(1)
<==>return 1 +
if 1 > 0:
return 1 + digits(1 // 10)
<==>return 1 + digits(0)
<==>return 1 +
if 0 > 0:
return 1 + digits(0 // 10)
else:
return 0
else:
return 0
else:
return 0
digits(0)返回0;
位数(1 // 10)返回1 + 位数(0) = 1 + 0,