四则运算的递归python实现

来源:互联网 发布:musecc 2018mac破解版 编辑:程序博客网 时间:2024/06/03 04:57

本文采用中国慕课网上的《程序设计与算法2》郭老师的方法进行。

问题:(1+(2*3+4)/2+4/2)程序用来解决这种四则运算,全部是整数。

首先,清晰下解决的问题。这是一个表达式子,他是由项组成,项之间的运算是可以相加减。项是由因子组成,因子之间可以乘或者除。因子有两种情况,一种是一个整数,或者是一个表达式,例如,(1+2+3)×3,其中前面的(1+2+3)就是一个表达式。


因此,这种逻辑关系非常清晰,也利于接下来写程序。主要由三个函数组成,表达式函数,项函数term_value,因子函数factor_value。函数读字符串,然后返回先计算出的结果值和剩余的表达式。程序代码如下:


def calculate(a):    result,a = term_value(a) # read the first term    if len(a)==0:        return result,a    boo = True    i =0     while len(a)>0 and boo:   #把表达式的所有项追个检查出来       if a[i] =='+':       #加           a = a[1:]           res,a = term_value(a)           result+=res       elif a[i]=='-':       #减           a = a[1:]           res,a = term_value(a)           result-=res       elif a[i] == ')' :     #这个部分处理的不好,因为下面去掉了(,没有去掉),所以这里特地去掉了。郭老师的c++程序貌似没有这个过程           a = a[1:]              else:           boo = False       return result,a    def term_value(a):    #把所有项的因子全部检查出来,比如1*2*3*4/5*(1+2)    if len(a) ==1:        return int(a),''                  #这段似乎重复了    result,a= factor_value(a)    #开始检查第一个因子,把运算结果都叠加都这个上    boo = True    i =0    while len(a)>0 and boo:  #其余因子,并把结果跟第一个相乘或者相除        if a[i]=='*':         #乘            a = a[1:]            result = factor_value(a)[0]*result            a = factor_value(a)[1]        elif a[i]=='/':    #除            a = a[1:]            result = result/factor_value(a)[0]            a = factor_value(a)[1]        else:            boo = False    return result,a    def factor_value(a):    #检查因子    if a[0]=='(':               #因子是一个表达式        a = a[1:]        return calculate(a)    else:                        #因子是一个整数的情况        s = 0        i = 0        while i<len(a) and a[i].isdigit():             s = s*10+int(a[i])            a =a[1:]        return s,ab ='1+1*8+3+(1+2)+((4/2)*2)'print(calculate(b))