zoukankan      html  css  js  c++  java
  • 四则运算练习

    递归:

    def oper_two(num_one, oper, num_two):
        if oper == '+':
            return str(int(num_one) + int(num_two))
        if oper == '-':
            return str(int(num_one) - int(num_two))
        if oper == '*':
            return str(int(num_one) * int(num_two))
        if oper == '/':
            if num_two != '0':
                return str(int(num_one) / int(num_two))
        print 'oper_two error!'
    
    #a = oper_two('4', '/', '2')
    #print a
    
    def compute_str(mystr):
        print "str is: " , mystr
        if len(mystr) < 4:
            return oper_two(mystr[0], mystr[1], mystr[2])
        if mystr[1] == '*' or mystr[1] == '/':
            return compute_str(compute_str(mystr[0:3]) + mystr[3:])
        elif mystr[3] == '*' or mystr[3] == '/':
            return compute_str(mystr[0:2] + compute_str(mystr[2:5]) + mystr[5:])
        else:
            return compute_str(compute_str(mystr[:3]) + mystr[3:])
    
    
    def compute_allstr(allstr):
        print "allstr is:" , allstr
        first = allstr.find('(')
        last = allstr.rfind(')')
    #    print first , 'and', last
        if first != -1 and last != -1:
            return compute_allstr(allstr[:first] + compute_str(allstr[first+1:last]) + allstr[last+1:])
        else:
            return compute_str(allstr)
        
    
    #arith_str = "1+2*3-7/2"
    #result = compute_str(arith_str)
    
    arith_str = "1+2*(7-3)/2"
    result = compute_allstr(arith_str)
    
    print result
    

     输出:

    allstr is: 1+2*(7-3)/2
    str is:  7-3
    allstr is: 1+2*4/2
    str is:  1+2*4/2
    str is:  2*4
    str is:  1+8/2
    str is:  8/2
    str is:  1+4
    5

    def oper_two(num_one, oper, num_two):
        if oper == '+':
            return str(int(num_one) + int(num_two))
        if oper == '-':
            return str(int(num_one) - int(num_two))
        if oper == '*':
            return str(int(num_one) * int(num_two))
        if oper == '/':
            if num_two != '0':
                return str(int(num_one) / int(num_two))
        print 'oper_two error!'
    
    #a = oper_two('4', '/', '2')
    #print a
    
    def compute_str(mystr):
        print "str is: " , mystr
        tmp_list = []
        if len(mystr) < 4:
            return oper_two(mystr[0], mystr[1], mystr[2])
        if mystr[1] == '*' or mystr[1] == '/':
            for i in mystr[0:3]:
                tmp_list.append(i)
            for i in mystr[3:]:
                tmp_list.append(i)
            return compute_str(tmp_list)
        elif mystr[3] == '*' or mystr[3] == '/':
            for i in mystr[0:2]:
                tmp_list.append(i)
            tmp_list.append(compute_str(mystr[2:5]))
            for i in mystr[5:]:
                tmp_list.append(i)
            return compute_str(tmp_list)
        else:
            tmp_list.append(compute_str(mystr[:3]))
            for i in mystr[3:]:
                tmp_list.append(i)
            return compute_str(tmp_list)
    
    
    def compute_allstr(allstr):
        print "allstr is:" , allstr
        tmp_list = []
        count = 0
        first = -1
        last = -1
        for i in allstr[:]:
            count += 1
            if i == '(':
                first = count
        count = 0
        for i in allstr[-1::-1]:
            count += 1
            if i == ')':
                last = count
                
        print first , 'and', last
        if first != -1 and last != -1:
            for i in allstr[:first-1]:
                tmp_list.append(i)
            tmp_list.append(compute_str(allstr[first:-last]))
            for i in allstr[-last+1:]:
                tmp_list.append(i)
            return compute_allstr(tmp_list)
        else:
            return compute_str(allstr)
        
    
    #arith_str = "1+2*3-7/2"
    #result = compute_str(arith_str)
    
    
    #arith_str = "1+2*(7-3)/2"
    #result = compute_allstr(arith_str)
    
    def str2list(mystr):
        mylist = []
        one_num = 0
        tmp_i = ''
        for i in mystr:
            if i.isdigit():
                one_num = one_num * 10 + int(i)
            elif i == '(':
                mylist.append(i)
            elif i == ')':
                mylist.append(one_num)
                one_num = 0
                mylist.append(i)
            else:
                if tmp_i != ')':
                    mylist.append(one_num)
                    one_num = 0
                mylist.append(i)
            tmp_i = i
            
        mylist.append(one_num)
        return mylist
    #
    #arith_str = "1+2*17-3/2"
    arith_str = "1+2*(17-3)/2"
    
    arith_list = str2list(arith_str)
    print arith_list
    result = compute_allstr(arith_list)
    
    print result
    

     输出:

    [1, '+', 2, '*', '(', 17, '-', 3, ')', '/', 2]
    allstr is: [1, '+', 2, '*', '(', 17, '-', 3, ')', '/', 2]
    5 and 3
    str is:  [17, '-', 3]
    allstr is: [1, '+', 2, '*', '14', '/', 2]
    -1 and -1
    str is:  [1, '+', 2, '*', '14', '/', 2]
    str is:  [2, '*', '14']
    str is:  [1, '+', '28', '/', 2]
    str is:  ['28', '/', 2]
    str is:  [1, '+', '14']
    15

    使用栈:

  • 相关阅读:
    Building a flexiable renderer
    Indirect Illumination in mental ray
    我的心情
    Cellular Automata
    Subsurface Scattering in mental ray
    Shader Types in mental ray
    BSP Traversal
    我的渲染器终于达到了MR的速度
    How to handle displacement and motion blur
    说明
  • 原文地址:https://www.cnblogs.com/Jason-Ch/p/3303676.html
Copyright © 2011-2022 走看看