Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算串中给定电路的总电阻_Python_Recursion_Divide And Conquer - Fatal编程技术网

Python 计算串中给定电路的总电阻

Python 计算串中给定电路的总电阻,python,recursion,divide-and-conquer,Python,Recursion,Divide And Conquer,我一直在努力解决这个问题。这就是问题所在: 给定描述电路的字符串,计算总电阻 电路的一部分 以下是一个例子: 输入:35秒 预期输出:8 字符串中的操作数由运算符尾随,表示电阻器是串联还是并联。但是,让我们分析一个更复杂的电路: 输入:35s0p32sp 预期输出:0 逐步: 输入开始处的35s为我们提供了8,因此第一个中间步骤是字符串80p32sp 8 0 P给出了0,因为一个电阻器短路,因此我们得到0 3 2 S P 32p是5 最后,05p是0 这是我的尝试。我尝试使用递归,因为它

我一直在努力解决这个问题。这就是问题所在:

给定描述电路的字符串,计算总电阻 电路的一部分

以下是一个例子:

  • 输入:
    35秒
  • 预期输出:
    8
字符串中的操作数由运算符尾随,表示电阻器是串联还是并联。但是,让我们分析一个更复杂的电路:

  • 输入:
    35s0p32sp
  • 预期输出:
    0
逐步:

  • 输入开始处的
    35s
    为我们提供了8,因此第一个中间步骤是字符串
    80p32sp
  • 8 0 P
    给出了
    0
    ,因为一个电阻器短路,因此我们得到
    0 3 2 S P
  • 32p
    5
  • 最后,
    05p
    0
  • 这是我的尝试。我尝试使用递归,因为它似乎是一个可以通过这种方式解决的问题。首先,我编写了一个helper函数:

    def new_resistance(a,b,c):
    if c == '':
        if int(a) == 0 or int(b) == 0:
            return 0
        else:
            return 1/(1/int(a) + 1/int(b))
    else:
        return int(a) + int(b)
    
    以及计算电路新电阻的函数:

    def resistance(array):
    if isinstance(array, int):
        return array
    else:
        if isinstance(array,list):
            temp = array
        else:
            temp = array.split(" ")
        i = 0
        while True:
            try:
                a = new_resistance(temp[i], temp[i+1], temp[i+2])
            except Exception as e:
                i += 1            
            if len(temp[i+3:]) == 0:
                return resistance(new_resistance(temp[i], temp[i+1], temp[i+2]))
            else:
                return resistance(temp[:i] + [new_resistance(temp[i], temp[i+1], temp[i+2])] + temp[i+3:])
    
    该程序的思想是从列表的开头开始,计算列表的前三个元素的阻力,然后将它们附加到新列表的开头(没有这三个元素),并使用新列表再次调用函数。执行此操作直到只剩下一个整数,然后返回整数

    感谢您的帮助


    更新:

    该问题的解决方案是使用一个堆栈和一个类似于NPR解析器的解析器

    operator_list = set('PS')
    
    def resistance(circuit):
      temp = circuit.split(" ")
      stack = []
      for char in temp:
          if char in operator_list:
              a = new_resistance(stack.pop(), stack.pop(), char)
              print(a)
              stack.append(a)
          else:
              print(char)
              stack.append(char)
      return stack[-1]
    
    def new_resistance(a,b,c):
      if c == 'P':
          if float(a) == 0 or float(b) == 0:
              return 0
          else:
              return 1/(1/float(a) + 1/float(b))
      else:
          return float(a) + float(b)
    
    circuit = '3 5 S 0 P 3 2 S P'
    resistance(circuit)
    
    # 3
    # 5
    # 8.0
    # 0
    # 0
    # 3
    # 2
    # 5.0
    # 0
    


    您的程序,或者更具体地说,您的程序似乎依赖于
    反向波兰语符号
    ,而反向波兰语符号又是。简单地说,
    RPN
    是一种抽象表示,其中算术表达式的运算符跟随其操作数,而在
    普通波兰表示法中,运算符位于其操作数之前。基于此表示的解析器可以通过使用堆栈(通常不需要解释括号)轻松实现


    如果你的任务是开发这个解析器,你可能会从我上面链接的维基百科文章中得到一些信息。

    问题是,一旦你达到
    032sp
    ,你就不能简单地获取前3个元素。您需要在字符串中的任何位置查找编号S或P

    您可以使用正则表达式执行此任务:

    import re
    
    circuit = '3 5 S 0 P 3 2 S P'
    
    pattern = re.compile('(\d+) +(\d+) +([SP])')
    
    def parallel_or_serie(m):
      a, b, sp = m.groups()
      if sp == 'S':
        return str(int(a) + int(b))
      else:
        if a == '0' or b == '0':
          return '0'
        else:
          return str(1/(1/int(a) + 1/int(b)))
    
    while True:
      print(circuit)
      tmp = circuit
      circuit = re.sub(pattern, parallel_or_serie, circuit, count=1)
      if tmp == circuit:
        break
    
    # 3 5 S 0 P 3 2 S P
    # 8 0 P 3 2 S P
    # 0 3 2 S P
    # 0 5 P
    # 0
    

    请注意,
    1 p
    将输出
    0.5
    。您可以将
    int
    替换为
    float
    ,并修改正则表达式以解析float。

    将首次识别RPN的@none归为贷方

    我想起了往事。20世纪80年代,我在8位计算机上玩第四语言。好,回到Python:

    circuit = '3 5 S 0 P 3 2 S P'
    
    stack = []
    for n in circuit.split():
        if n == 'S':
            r1 = stack.pop()
            r2 = stack.pop()
            stack.append(r1+r2)
        elif n == 'P':
            r1 = stack.pop()
            r2 = stack.pop()
            stack.append(0.0 if (r1 == 0 or r2 == 0) else 1/(1/r1+1/r2))
        else:
            stack.append(float(n))
    
    assert len(stack) == 1    
    print(stack[0])
    
  • 根据VPfB的精神,开启任何串并联组合(不仅仅是成对)


  • P
    S
    之前是否总是有两个表达式<代码>'035s'
    无效?@EricDuminil因为这是一个虚拟示例,在所有与问题一起提供的测试用例中都有,是的。我记得我解决了一个类似的问题,我必须转换,现在我想起来了,问题非常相似。非常感谢。
     def calculateresistor(dataString):
     stack = []
     r = []
     cicuit=dataString
     for n in circuit.split():
         if n == 'S':
             stackSize=size(stack)
             if size(stack)>=2:
                 for k in range(0,size(stack)-1):
                     r.append(float(stack.pop()))
                     r.append(float(stack.pop()))
                     stack.append((r[-1]+r[-2]))
         elif n == 'P':
             stackSize=size(stack)
             if size(stack)>=2:
                 for k in range(0,size(stack)-1):
                     r.append(float(stack.pop()))
                     r.append(float(stack.pop()))
                     r.append(0.0 if (r[-1] == 0 or r[-2] == 0) else (1/(1/r[-1]+1/r[-2])))
                     stack.append(r[-1])
         else:
             stack.append(float(n))
     assert len(stack) == 1
     return(stack)