微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

递归:返回列表中具有偶数个字符的项目数 评论:在评论中:我的推荐调试:

如何解决递归:返回列表中具有偶数个字符的项目数 评论:在评论中:我的推荐调试:

我无法绕过递归的概念。有人可以批评我的代码吗?我试图递归地返回列表中具有偶数位数的项目数。

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])

解决方法

评论:在评论中:

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","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","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','there?']
    Enter evenItems. Level: 2
    Current Word is: there
    Rest of List is: ['anybody','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
,

您可以考虑使用 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","there?"]
print(numEvenItems(lst))

输出:

2

尝试 here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。