如何从递归函数返回单个布尔值?

时间:2017-09-27 20:22:26

标签: python recursion

我有这个功能:

def most(P, S):
    def recursion(P,S):
        if len(S) == 0:
           return []
        elif P(S[0]):
            return [P(S[0])] + recursion(P, S[1:])
        else:
            return recursion(P, S[1:])
    if len(recursion(P,S)) > len(S)/2:
        return True
    else:
        return False

它输入函数P和list,S。如果P(S [i])的结果对于大多数S为真,那么函数most()应该返回true。知道如何在没有函数内部函数的情况下递归执行此操作吗?换句话说,如何从以列表作为输入的递归函数返回单个布尔值?

谢谢!

1 个答案:

答案 0 :(得分:1)

递归的最大关键是理解"终端条件。"功能必须停止的状态是什么?在这种情况下,它是空列表。

def most(pred, lst):
    if lst == []:
       return # but what do we return?

你需要跟踪满足期望的列表元素的数量......所以你必须跟踪期望值(即,为了#34;大多数&#34,必须记录多少个。 ;是真实的),以及到目前为止的计数。让我们添加......

def most(pred, lst, threshold=None, count=0):
    if threshold is None:
        threshold = len(lst) // 2

    if lst == []:
        return count > threshold

那么,那么我们需要解构"列表,以便我们可以对其进行递归。让我们添加......

def most(pred, lst, threshold=None, count=0):
    if threshold is None:
        threshold = len(lst) // 2

    if lst == []:
        return count > threshold

    # Check the 'truth' of the head of the list...
    if pred(lst[0]):
        count += 1

    # ...and pass the tail of the list into the next iteration.
    return most(pred, lst[1:], threshold, count)

这应该就是你需要的一切。现在,我要提醒你,如果你的列表有很长的篇幅,那么Python会破坏它的堆栈。由于所有额外的函数调用,这也比使用for循环或reduce的解决方案慢得多。

如果我为生产代码实施most,我会这样做:

def most(pred, lst):
    return sum(1 for x in lst if pred(x)) > len(lst) // 2