2

私はPythonで宿題をします。そこでは、「ロボット」を最初から最後まで取得し、パスをゴールに戻すことになっています。ロボットを検索していますが、リストに最初から最後までのパスを表示したいだけです。現在、pathListは訪問したすべての正方形を返します。また、目標に関しては停止せず、他のノードを続行します。私は何が欠けていますか?

def find(labyrinth, robotPos, pathList = []):

    frontier = adjacent_passages(labyrinth, robotPos)   
    pathList.append(robotPos)

    if len(frontier) == 1:
        print("Corner")
        return []

    for i in range(0, len(frontier)):
        if frontier[i] == goal:
            pathList.append(frontier[i])
            return pathList

    for i in range(0, len(frontier)):
        if frontier[i] not in pathList:
            pathList.append(frontier[i])
            if (find(labyrinth, frontier[i], pathList) == []):
                pathList.pop()

    return pathList
4

2 に答える 2

2

これがあなたの問題の答えであるかどうかはわかりませんが、最初に気付くのは、デフォルトの関数パラメーター(pathList = [])としてリストを使用するべきではないということです。

「驚き最小の原則」と可変デフォルト引数を参照してください

于 2012-11-24T02:16:29.623 に答える
2

検索が失敗しても削除せずに検索しているので、リストには訪問したすべての位置が含まれていますappend。リストの変更(追加/ポップ)を完全に回避し、代わりに次の反復への引数として新しい値を渡すことをお勧めします。robotPospathList

if (find(labyrinth, frontier[i], pathList + [frontier[i]]) == [])...

その他の可能な簡略化は次のとおりです。

  • ドロップrobotPos。現在の位置をpath引数の最後の項目とします
  • 2つではなく1つのループを使用する
  • ループでは、for x in stuff代わりに使用しますfor i in range(0, len(stuff))

何かのようなもの

def find(path):

    if path[-1] == goal:
        return path

    for new_position in adjacent_positions(path[-1]):
        if new_position not in path:
            found_path = find(path + [new_position])
            if found_path:
                return found_path

    return None
于 2012-11-24T02:21:56.037 に答える