递归的流程在Python罗马到阿拉伯语

时间:2013-12-27 21:10:23

标签: python recursion

所以我刚刚解决了关于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])开始同时执行或第二个任期是否等到第一个完成/返回值?

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])(右侧部分)。

请记住,第一部分也可能有递归调用,因此第二部分必须等到它返回一个值才能执行。