2012-04-23 3 views
1

У меня возникла странная проблема. Этот код возвращает None вместо Правда, несмотря на то, что идет в правильную ветку и вычисляется в True:return statement возвращает 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

Вы должны включать 'def' для функции – jamylak

+3

Тогда мы будем знать, что вы должны быть печать/возвращение! – Colleen

+1

Там. Обновлен вопрос. В коде есть только оператор возврата - факт, который я пропустил, поставив вопрос. – fixxxer

ответ

7

Это рекурсивная функция. Когда вы доберетесь до терминала (string == ""), вы вернетесь 1 или 2. Это возвращается к вызывающей функции - предыдущий вызов nfsmsim. Но , что звонок nfsmsim ничего не возвращает! Вам нужно получить значение от вызова терминала nfsmsim и передать его, вернув его снова.

Другими словами, вам нужно возвратить в каждой из этих двух ветвей вашего if заявления:

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

[redacted] Я не хочу слишком много отдавать для HW;) –

+1

@ Thr4wn, спасибо :) fixxxer, не снисходительно, но вы, вероятно, узнаете больше, если вы поймете, куда самому поставить заявления о возврате , – senderle

+0

Спасибо за указатель! :) Я закончил тем, что установил флаг и вернул True, основываясь на нем, в конце функции. Но это не похоже на самый чистый способ сделать это. – fixxxer

1

Не используя команду возврата, когда функция заканчивается так же, как не с помощью возврата None.

Поскольку функция является рекурсивной, и вы используете свой результат, вы должны возвращать значение каждого из его вызова также внутри своего тела:

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 
Смежные вопросы