print 'gsearch1...' More = lambda x: 1 # continuation test: generate all def search(start, goal, graph): solns = [] if generate([start], goal, solns, graph): More([]) solns.sort( lambda x, y: cmp(len(x), len(y)) ) # sort by path length return solns def generate(path, goal, solns, graph): state = path[-1] if state == goal: solns.append(path) # change solns in-place return More(path) # resume at prior level? else: for arc in graph[state]: if arc in path: # cycle found: skip it continue if not generate(path + [arc], goal, solns, graph): return 0 return 1 # resume prior level if __name__ == '__main__': import gtest print search('E', 'D', gtest.Graph)