input: from typing import List
  
  def solve_maze(maze: Maze, start: tuple, end: tuple) -> List[int]:
      """Solves a maze by finding the shortest path from start to end using a recursive approach.
      The maze is represented as a grid of 0s and 1s, where 1 represents a passable cell and 0 represents an obstacle.
      The function returns the list of distances from start to each cell in the path, or an empty list if no path is found.
      
      >>> maze = Maze(3, 3)
      >>> maze._grid = [[1, 0, 1], [1, 1, 1], [1, 0, 1]]
      >>> solve_maze(maze, (0, 0), (2, 2))
      [0, 1, 2, 3, 4]
      >>> solve_maze(maze, (0, 0), (2, 0))
      []
      """
output:     if start == end:
          return [0]
      
      rows, cols = len(maze._grid), len(maze._grid[0])
      directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
      
      def is_valid(x, y):
          return 0 <= x < rows and 0 <= y < cols and maze._grid[x][y] == 1
      
      def dfs(current, path):
          x, y = current
          if current == end:
              return path
          for dx, dy in directions:
              nx, ny = x + dx, y + dy
              if is_valid(nx, ny) and (nx, ny) not in visited:
                  visited.add((nx, ny))
                  result = dfs((nx, ny), path + [len(path)])
                  if result:
                      return result
          return []
      
      visited = set()
      visited.add(start)
      path = dfs(start, [0])
      return path if path else []