code: def _collapse_addresses_recursive(addresses):
      
      while True:
          last_addr = None
          ret_array = []
          optimized = False
  
          for cur_addr in addresses:
              if not ret_array:
                  last_addr = cur_addr
                  ret_array.append(cur_addr)
              elif (cur_addr.network_address >= last_addr.network_address and
                  cur_addr.broadcast_address <= last_addr.broadcast_address):
                  optimized = True
              elif cur_addr == list(last_addr.supernet().subnets())[1]:
                  ret_array[-1] = last_addr = last_addr.supernet()
                  optimized = True
              else:
                  last_addr = cur_addr
                  ret_array.append(cur_addr)
  
          addresses = ret_array
          if not optimized:
              return addresses
docs: Loops through the addresses, collapsing concurrent netblocks.
  
      Example:
  
          ip1 = IPv4Network('192.0.2.0/26')
          ip2 = IPv4Network('192.0.2.64/26')
          ip3 = IPv4Network('192.0.2.128/26')
          ip4 = IPv4Network('192.0.2.192/26')
  
          _collapse_addresses_recursive([ip1, ip2, ip3, ip4]) ->
            [IPv4Network('192.0.2.0/24')]
  
          This shouldn't be called directly; it is called via
            collapse_addresses([]).
  
      Args:
          addresses: A list of IPv4Network's or IPv6Network's
  
      Returns:
          A list of IPv4Network's or IPv6Network's depending on what we were
          passed.