code: def rdp_rec(M, epsilon, dist=pldist):
      
      dmax = 0.0
      index = -1
  
      for i in xrange(1, M.shape[0]):
          d = dist(M[i], M[0], M[-1])
  
          if d > dmax:
              index = i
              dmax = d
  
      if dmax > epsilon:
          r1 = rdp_rec(M[:index + 1], epsilon, dist)
          r2 = rdp_rec(M[index:], epsilon, dist)
  
          return np.vstack((r1[:-1], r2))
      else:
          return np.vstack((M[0], M[-1]))
docs: Simplifies a given array of points.
  
      Recursive version.
  
      :param M: an array
      :type M: numpy array
      :param epsilon: epsilon in the rdp algorithm
      :type epsilon: float
      :param dist: distance function
      :type dist: function with signature ``f(point, start, end)`` -- see :func:`rdp.pldist`