0

この問題に対する私のコードは次のとおりです。

def nfsmaccepts(current, edges, accepting, visited):
    print ('iteration', current, ''.join([i[1] for i in visited]))
    if current in accepting:
        print ('accepted')
        return ''.join([i[1] for i in visited])
    else:
        for edge in edges:
            if edge not in visited and current == edge[0]:
                print (edge, ' matched')
                visited.append(edge)
                for i in edges[edge]:
                    if nfsmaccepts(i, edges, accepting, visited) is not None:
                        print (edge, i, ' chosen')
                        return nfsmaccepts(i, edges, accepting, visited)
                    else:
                        visited = visited[:-1]

結果は次のとおりです。

print(nfsmaccepts(1, edges, accepting, []))
iteration 1
(1, 'a') matched
iteration 2 a
(2, 'a') matched
iteration 2 aa
iteration 3 a
(3, 'b') matched
iteration 4 ab
(4, 'c') matched
iteration 5 abc
accepted
(4, 'c') 5 chosen
iteration 5 abc
accepted
(3, 'b') 4 chosen
iteration 4 abc
None

明らかに再帰関数の端末呼び出しに到達したときに、プログラムが for ループを実行し続けて None を返す理由がわかりません。助けてください!

4

1 に答える 1

1

ifステートメントから関数を呼び出すと、「受け入れられた」状態が発生します。

if nfsmaccepts(i, edges, accepting, visited) is not None

その後、印刷を続けます(4, 'c') 5 chosen前のイテレーションでも同じことを行ったので、イテレーション 4 から再度呼び出して、同様に印刷(3, 'b') 4 chosenします。

おそらく、その関数を一度だけ呼び出して、テストして返す前に結果を保存するつもりでしたか?

accepts = nfsmaccepts(i, edges, accepting, visited)
if accepts is not None:
    print (edge, i, ' chosen')
    return accepts
于 2013-03-05T17:14:18.973 に答える