2015-08-03 128 views
0

我在Python很新,我想寫一個簡單的遞歸函數返回結果:遞歸函數,從「如果」語句而不是「其他」語句

def bugged_recursion(inp_value,list_index=0): 
    '''Define a recursive function that tag lists according to one parameter. 
    ''' 
    #check if a criterion is true at position 0 in the list 
    if list_index == 0: 
     if inp_value[list_index] == 'valid': 
      status = 'valid inp_value' 
     #if the criterion is false call the function at the next index 
     else: 
      status = 'invalid inp' 
      list_index +=1 
      bugged_recursion(inp_value,list_index=list_index) 
    #check if a criterion is true at position 1 in the list 
    else: 
     if inp_value[list_index] == 'valid': 
      status = 'index {} is a valid inp_value'.format(list_index) 
     else: 
      status = 'index is never a valid inp_value' 
    print(status) 
    #return the input and its status 
    return (inp_value,status) 

if __name__ == '__main__': 
    inp_value = ['invalid','invalid'] 
    bugged_recursion(inp_value) 

我不明白爲什麼此函數從if語句返回狀態,而不是返回最後一個else語句中包含的狀態。 對我來說,最奇怪的是它在某個點打印正確的狀態,但不會返回它。

我無法理解爲什麼......我真的好奇我該如何使用遞歸函數來執行此任務。

回答

0

哇哇,這是多麼的折磨。

def bugged_recursion(inp_value, list_index=0): 
    # i don't get why you compare list_index here 
    if list_index == 0: 
     # you'll get an IndexError if list_index > len(inp_value) 
     if inp_value[list_index] == 'valid': 
      status = 'valid inp_value' 
     else: 
      status = 'invalid inp' 
      # there is only one place where you increment list_index 
      # i suppose there is something wrong here 
      list_index +=1 
      # you forgot to return here 
      return bugged_recursion(inp_value, list_index=list_index) 
    else: 
     if inp_value[list_index] == 'valid': 
      status = 'index {} is a valid inp_value'.format(list_index) 
     else: 
      status = 'index is never a valid inp_value' 
    return (inp_value,status) 

這且不說,人們通常傾向於避免recursion儘可能地(例如在Dive into Python)。

這是否涵蓋了您的需求?

def no_recursion(inp_value): 
    for i, val in enumerate(inp_value): 
     # you probably have a good reason to test the index 
     if i == 0: 
      if val == 'valid': 
       yield 'valid inp_value: %s' % val 
      else: 
       yield 'invalid inp: %s' % val 
     else: 
      yield 'index %s is %s valid inp_value' % (
       i, 
       'a' if val == 'valid' else 'never' 
      ) 

print tuple(no_recursion(inp_value)) 

給出:('invalid inp: invalid', 'index 1 is never valid inp_value')

+0

感謝解釋這兩個如何糾正我的代碼,以及如何寫出更好的,非遞歸函數。我不知道是否有必要返回bugged_recursion() 道歉,如果我似乎天真,但我是一個自學者,我會看看你的鏈接!感謝您的幫助,我很高興今天學到了一些東西! –