from typing import Dict, List, TypeVar, Set, Generator T = TypeVar( 'T' ) def dfs( graph: Dict[ T, List[ T ] ], initial: T ) \ -> Generator[ T, None, None ]: seen : Set[ T ] = set() yield from dfs_rec( graph, initial, seen ) def dfs_rec( graph: Dict[ T, List[ T ] ], initial: T, seen: Set[ T ] ) -> Generator[ T, None, None ]: if initial in seen: return seen.add( initial ) for n in graph[ initial ]: yield from dfs_rec( graph, n, seen ) yield initial import run_tests