print 'gsearch2...' More = lambda x: 1 def search(start, goal, graph): solns, stopped = generate( ([start], []), goal, graph) if not stopped: More([]) solns.sort( lambda x, y: cmp(len(x), len(y)) ) return solns def generate(paths, goal, graph): # returns solns list solns = [] # use a tuple-stack while paths: front, paths = paths # pop the top path state = front[-1] if state == goal: solns.append(front) # goal on this path if not More(front): return solns, 1 else: for arc in graph[state]: # add all extensions if arc not in front: paths = (front + [arc]), paths return solns, 0 if __name__ == '__main__': import gtest print search('E', 'D', gtest.Graph)