所以我刚刚解决了关于codeacademy的递归的最后一个测验。但是当我试图理解pythontutor.org上这段代码的执行流程时,我无法理解这段代码的流程。
def rval(letr):
if(letr=='I'):
return 1
elif(letr=='V'):
return 5
elif(letr=='X'):
return 10
elif(letr=='L'):
return 50
elif(letr=='C'):
return 100
elif(letr=='D'):
return 500
elif(letr=='M'):
return 1000
else:
return "error"
def arabic(n):
if len(n)==0:
return 0
elif len(n)==1:
return rval(n)
elif len(n)==2:
if rval(n[0])>rval(n[1]):
return rval(n[0])+rval(n[1])
else:
return rval(n[1])-rval(n[0])
else:
return arabic(n[len(n)-2:])+arabic(n[:len(n)-2])
arabic('DXCVI')
======问题面临======
我的问题是这个 -
假设我运行arabic('DXCVI')
,那么此行arabic(n[len(n)-2:])+arabic(n[:len(n)-2])
如何执行
同时arabic(n[len(n)-2:])
& arabic(n[:len(n)-2])
开始同时执行或第二个任期是否等到第一个完成/返回值?
答案 0 :(得分:1)
始终首先调用左侧部分arabic(n[len(n)-2:])
。找到这个的简单方法是在print
函数中添加arabic(n)
语句。
尝试这样的事情:
def arabic(n):
print n
if len(n)==0:
return 0
elif len(n)==1:
return rval(n)
elif len(n)==2:
# more code
哪会输出这个:
DXCVI
VI
DXC
XC
D
证明左侧arabic(n[len(n)-2:])
在+arabic(n[:len(n)-2])
之前被调用。
答案 1 :(得分:0)
执行第一个arabic(n[len(n)-2:])
(左侧部分),然后执行arabic(n[:len(n)-2])
(右侧部分)。
请记住,第一部分也可能有递归调用,因此第二部分必须等到它返回一个值才能执行。