sub find_path { my ($start_at, $end_at, $been_there) = (@_, {}); if ($start_at == $end_at) { return [$start_at]; } else { my @try_these = grep { ! $been_there->{$_} } @{$adjacency_list{$start_at}}; return map { my @cdr_list = find_path($_, $end_at, {%$been_there, $start_at => 1}); map [$start_at, @$_], @cdr_list; } @try_these; } }