【问题标题】:Recursion: Return number of items in list with an even number of characters递归:返回列表中具有偶数个字符的项目数
【发布时间】:2020-11-02 03:30:34
【问题描述】:

我很难理解递归的概念。有人可以帮助批评我的代码吗?我正在尝试以递归方式返回具有偶数位数的列表中的项目数。

alist = ["hello", "is", "there", "anybody", "out", "there?"]


def evenItems(alist):
  
    if len(alist[0]) == 0:
        return 0
    if len(alist[0]) % 2 == 0:
        
        return evenItems(alist[1:len(alist)-1] + 1 ) 
        
    else:
        return evenItems(alist[1:len(alist)-1])

【问题讨论】:

  • 不是这样吗?你的问题到底是什么?
  • 如果您正在寻找对工作代码的审查,请在我们的兄弟网站Code Review 上检查这是否可以接受
  • 我投票结束这个问题,因为它要求Code Review
  • 目前最好的代码批评者是 python 解释器。它给你的错误很明显。

标签: python list recursion index-error


【解决方案1】:

批评:在 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

【讨论】:

  • +1 遵循递归的另一个技巧是在 IDE 上使用调试器,例如Pycharm/VSCode 等
【解决方案2】:

您可以考虑改为使用 negative indexing 在列表的后面执行检查,以获取最后一个元素和不包括最后一个元素的子列表,以便下一次递归调用:

def numEvenItems(alist):
    if len(alist) == 0:
        return 0
    return (1 if len(alist[-1]) % 2 == 0 else 0) + numEvenItems(alist[:-1])

lst = ["hello", "is", "there", "anybody", "out", "there?"]
print(numEvenItems(lst))

输出:

2

试试看here

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多