# use paths stack instead of recursion def search(start, goal, graph): solns = generate( ([start], []), goal, graph) 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 else: for arc in graph[state]: # add all extensions if arc not in front: paths = (front + [arc]), paths return solns if __name__ == '__main__': import gtestfunc gtestfunc.tests(search)