表达式计算-Python版

运用递归的方法求解普通表达式的值

原理示意:

表达式 : 项 +或- [项] …
项 : 因子 *或/ [因子] …
因子 :表达式 或 整数(递归终点)

注: 以上类似编译原理的语法分析的巴科斯范式(BNF)表示,冒号右边能够推到出左边,也就是左边可以展开为右边的形式,知道不能再展开(遇到终结符)


index = 0

def expValue(exp):
    global index
    result = termValue(exp)
    more = True
    while more:
        #index += 1
        op = exp[index]
        if op in '+-':
            index += 1
            value = termValue(exp)
            if op == '+':
                result += value
            else:
                result -= value
        else:
            more = False
    return result

def factorValue(exp):
    global index
    result = 0
    c = exp[index]
    if c == '(':
        index += 1
        result = expValue(exp)
        index += 1
    else:
        while c.isdigit():
            result = 10 * result + int(c) - 0
            index += 1
            c = exp[index]
    return result

def termValue(exp):
    global index
    result = factorValue(exp)
    while True:
        op = exp[index]
        if op in '*/':
            index += 1
            value = factorValue(exp)
            if op == '*':
                result *= value
            else:
                result /= value
        else:
            break
    return result

def main():
    exp = '1+3*(3+1)*4+(1+5)#'
    result = expValue(exp)
    print('EXP : %d' % result)
    print('Compute Ok!')

if __name__ == '__main__':
    main()

注:
1、表达式字符串最后加#字符用于判断表达式结束
2、表达式的元素之间不能用空格,可以使用类似词法分析切割表达式各个Token改进

你可能感兴趣的:(算法)