1

我试图定义一个函数,如果列表中的每个项目都小于 2,则返回 true,否则返回 false。项目的类型可以是与列表不同的整数、浮点数、str 或某物。我应该检查清单。

def ifeveryitems(lst):
    for items in lst:
        if isinstance(items,list) and len(items) <= 2:
           return True and ifeveryitem(????)  # '????' should be the items other than the item that has been searched #
        else:
           return False
4

3 回答 3

5

从您的描述来看,您根本不需要递归调用:

def ifeveryitems(lst):
    for items in lst:
        if isinstance(items, list) and len(items) > 2:
           return False

    return True

或者,或者:

def ifeveryitems(lst):
    return all(len(items) <= 2 for items in lst if isinstance(items, list))
于 2013-01-19T19:14:41.003 回答
1

解决了您的问题后,我将一般解释循环与尾递归的概念,因为尾递归通常是一种有用的技术。
尽管 Python 中的循环和列表理解意味着您不太可能需要尾递归,但最好有它的想法。


递归调用函数的技术称为尾递归。使用尾递归和循环可以实现相同的目的,但您不需要两者。

要执行您想要的操作,您可以使用循环:

def ifeveryitems(lst):
    for items in lst:
        if not isinstance(items,list) or len(items) > 2:
            return False
    return True

或尾递归:

def ifeveryitems(lst):
    if isinstance(items,list) and len(lst)==0:
        return True
    return isinstance(lst[0],list) and len(lst[0]) <= 2 and ifeveryitems(lst[1:])

此函数检查第一项lst是否为列表且长度为 2 或更短,然后lst[1:]使用函数本身检查列表的其余部分 ( )。最终,它要么通过快捷方式返回 False(何时isinstance(lst[0],list) and len(lst[0]) <= 2为 False),要么达到整个列表用尽的基本情况,当它返回 True 时。


再举一个例子:实现len(L)自己。
假设L总是一个列表,您可以len使用循环来实现:

def len(L):
    i = 0
    for item in L:
        i += 1
    return i

(注意:使用这样的循环也称为累加)

或尾递归。

def len(L):
    if L==[]:
        return 0
    return 1 + len(l[1:])

它删除列表的第一项,并将列表其余部分的长度加 1。最终,它会到达 L 耗尽并减少到空列表的点,在这种情况下它只会返回 0。

于 2013-01-19T19:24:02.620 回答
1

您可以尝试以下方法:

def ifeveryitems(lst):
    return all(map(lambda x: x < 2, lst)) 
于 2013-01-19T19:20:56.693 回答