四则运算的递归python实现


本文采用中国慕课网上的《程序设计与算法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,a


b ='1+1*8+3+(1+2)+((4/2)*2)'

print(calculate(b))

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值