2012-04-23 21 views
1

私は奇妙な問題に遭遇しました。このコードは、それが正しいブランチにして行くとTrueに評価にもかかわらず、いずれの代わりに、真を返します:return文は値の代わりにNoneを返します

edges = { (1, 'a') : [2, 3], 
      (2, 'a') : [2], 
      (3, 'b') : [4, 3], 
      (4, 'c') : [5] } 
accepting = [2, 5] 
loc = [] 
def nfsmsim(string, current, edges, accepting): 

    if string != "": 
     if ((current, string[0]) in edges.keys()): 
      global loc 
      loc = edges[(current, string[0])] 
      print "edge found:",loc 

    if (string == ""): 
     print "string is over",current,accepting 
     print type(current), type(accepting) 
     if current in accepting : 
      print "1" 
      return True 
     else: 
      print "2" 
      return 2 
    # fill in your code here 
    elif (current, string[0]) in edges.keys(): 
     global loc 
     string = string[1:] 
     nfsmsim(string, loc[0], edges, accepting) 
    elif len(loc)>1: 
     global loc 
     nfsmsim(string, loc[1], edges, accepting) 


# This problem includes some test cases to help you tell if you are on 
# the right track. You may want to make your own additional tests as well. 
print nfsmsim("abc", 1, edges, accepting) 

これの出力は次のようになります。

string is over 5 [2, 5] 
<type 'int'> <type 'list'> 
1 
None (<< instead of True) 
+6

あなたが機能 – jamylak

+3

のためのあなたの 'def'を含める必要がありますその後、我々はあなたが印刷されることになっているものを知っているだろう/戻る! – Colleen

+1

があります。質問が更新されました。コードにはreturn文しかありません。私が質問をするのを忘れたという事実です。 – fixxxer

答えて

7

これは再帰関数です。ターミナルケース(string == "")に到達すると、1または2が返されます。それは呼び出し関数に戻ります - 前の呼び出しはnfsmsimです。しかしnfsmsimのコールは何も返されません!あなたはnfsmsimのターミナルコールから値を取得し、再度それを返すことによって渡す必要があります。言い換えれば

、あなたはあなたのif文のこれら二つの枝のそれぞれにreturn文が必要になります。関数は、戻りなしを使用していないと同じです終了時

elif (current, string[0]) in edges.keys(): 
    global loc 
    string = string[1:] 
    nfsmsim(string, loc[0], edges, accepting) 
elif len(loc)>1: 
    global loc 
    nfsmsim(string, loc[1], edges, accepting) 
+1

[編集]私はHWのためにあまり離れたくないと思っていません;) –

+1

@ Thr4wn、ありがとうございました:) fixxxer、謙遜ではありませんが、返信文をどこに置くべきかを考えれば、 。 – senderle

+0

ポインタありがとう! :)私はフラグを設定し、関数の最後にそれに基づいてTrueを返すことになりました。しかし、それを行う最もクリーンな方法のように見えません。 – fixxxer

1

はリターンコマンドを使用していません。

関数は再帰的であり、あなたはその結果を使用しているとして、あなたはまた、その本体の内側にそのコールのすべての値を返す必要がありますが:

elif (current, string[0]) in edges.keys(): 
    global loc 
    string = string[1:] 
    return nfsmsim(string, loc[0], edges, accepting) 
elif len(loc)>1: 
    global loc 
    return nfsmsim(string, loc[1], edges, accepting) 

あなたはグローバルLOCを使用して忘れる必要があります。ただそれを引数で渡してください。それはとにかく参照です:

edges = { (1, 'a') : [2, 3], 
      (2, 'a') : [2], 
      (3, 'b') : [4, 3], 
      (4, 'c') : [5] } 
accepting = [2, 5] 
loc = [] 
def nfsmsim(string, current, edges, accepting, loc): 

    if string != "": 
     if ((current, string[0]) in edges.keys()): 
      loc = edges[(current, string[0])] 
      print "edge found:",loc 

    if (string == ""): 
     print "string is over",current,accepting 
     print type(current), type(accepting) 
     if current in accepting : 
      print "1" 
      return True 
     else: 
      print "2" 
      return 2 
    # fill in your code here 
    elif (current, string[0]) in edges.keys(): 
     string = string[1:] 
     return nfsmsim(string, loc[0], edges, accepting, loc) 
    elif len(loc)>1: 
     return nfsmsim(string, loc[1], edges, accepting, loc) 


# This problem includes some test cases to help you tell if you are on 
# the right track. You may want to make your own additional tests as well. 
print nfsmsim("abc", 1, edges, accepting, loc) 

それは私のコンソール上で次のように出力されます

c:\tmp\___python\fixxxer\so10274792>python a.py 
edge found: [2, 3] 
edge found: [4, 3] 
edge found: [5] 
string is over 5 [2, 5] 
<type 'int'> <type 'list'> 
1 
True 
関連する問題