批评:在 cmets 中:
alist = ["hello", "is", "there", "anybody", "out", "there?"]
def evenItems(alist):
if len(alist[0]) == 0: # The base case is when alist is empty. So use 'alist' instead of 'alist[0]' (alist[0] is the first element)
return 0
if len(alist[0]) % 2 == 0:
# A few things here:
# - the '+1' should be on the outside of the parenthesis because it should not be part of the recursive evenItems function call
# - To get the rest of the list you could use alist[1:] (which is from index one to the end of the list)
return evenItems(alist[1:len(alist)-1] + 1 )
else:
return evenItems(alist[1:len(alist)-1])
我的建议
我喜欢制作不同的变量,以便我可以清楚地看到我正在处理的内容。你看我使用(currentWord 和 restOfList)。对于递归函数,我还喜欢将程序分成基本案例和递归调用(再次,只是为了更清楚)。
alist = ["hello", "is", "there", "anybody", "out", "there?"]
def evenItems(alist):
# Base Case: If alist is empty
if len(alist) == 0:
return 0
# Recursive call
currentWord = alist[0]
restOfList = alist[1:]
if len(currentWord) % 2 == 0:
return evenItems(restOfList) + 1
else:
return evenItems(restOfList)
print(evenItems(alist))
调试:
递归很困难。我通常喜欢打印出每次通话发生的情况,以便更好地理解。
alist = ["hello", "is", "there", "anybody", "out", "there?"]
def evenItems(alist, level):
print(" " * level + "Enter evenItems. Level: " + str(level))
# Base Case: If alist is empty
if len(alist) == 0:
print(" " * level + "Exit evenItems list empty. Level: " + str(level))
return 0
# Recursive call
currentWord = alist[0]
print(" " * level + "Current Word is: " + currentWord)
restOfList = alist[1:]
print(" " * level + "Rest of List is: " + str(restOfList))
currentEvenItemsCount = 0
if len(currentWord) % 2 == 0:
currentEvenItemsCount = evenItems(restOfList, level + 1) + 1
else:
currentEvenItemsCount = evenItems(restOfList, level + 1)
print(" " * level + "Exit evenItems even word. Level: " + str(level))
return currentEvenItemsCount
print(evenItems(alist, 0))
输出
Enter evenItems. Level: 0
Current Word is: hello
Rest of List is: ['is', 'there', 'anybody', 'out', 'there?']
Enter evenItems. Level: 1
Current Word is: is
Rest of List is: ['there', 'anybody', 'out', 'there?']
Enter evenItems. Level: 2
Current Word is: there
Rest of List is: ['anybody', 'out', 'there?']
Enter evenItems. Level: 3
Current Word is: anybody
Rest of List is: ['out', 'there?']
Enter evenItems. Level: 4
Current Word is: out
Rest of List is: ['there?']
Enter evenItems. Level: 5
Current Word is: there?
Rest of List is: []
Enter evenItems. Level: 6
Exit evenItems list empty. Level: 6
Exit evenItems even word. Level: 5
Exit evenItems even word. Level: 4
Exit evenItems even word. Level: 3
Exit evenItems even word. Level: 2
Exit evenItems even word. Level: 1
Exit evenItems even word. Level: 0
2