code: def check(degree, knot_vector, num_ctrlpts):
      
      try:
          if knot_vector is None or len(knot_vector) == 0:
              raise ValueError("Input knot vector cannot be empty")
      except TypeError as e:
          print("An error occurred: {}".format(e.args[-1]))
          raise TypeError("Knot vector must be a list or tuple")
      except Exception:
          raise
  
      # Check the formula; m = p + n + 1
      if len(knot_vector) != degree + num_ctrlpts + 1:
          return False
  
      # Check ascending order
      prev_knot = knot_vector[0]
      for knot in knot_vector:
          if prev_knot > knot:
              return False
          prev_knot = knot
  
      return True
docs: Checks the validity of the input knot vector.
  
      Please refer to The NURBS Book (2nd Edition), p.50 for details.
  
      :param degree: degree of the curve or the surface
      :type degree: int
      :param knot_vector: knot vector to be checked
      :type knot_vector: list, tuple
      :param num_ctrlpts: number of control points
      :type num_ctrlpts: int
      :return: True if the knot vector is valid, False otherwise
      :rtype: bool