使用递归函数返回值很困难

时间:2015-10-26 06:49:52

标签: python recursion

所以我正在编写一个递归函数,用二进制搜索算法确定列表中的整数成员资格,一旦函数完成递归,我就无法返回/打印一个值。说实话,我很难绕递归。每当我运行程序时,它会无限地输出一半错误消息。我的问题似乎是,如果该项目应该通过递归测试失败,它实际上不知道何时停止失败,它只是继续打印失败的条件/出现的错误消息。

程序必须在完成运行后打印出条件,这样如果我说is_member(list_of_numbers,83),如果它在列表中,它将打印“True”。

这是我工作几个小时后的代码。

def is_member(set, number):
    if len(set) == 0:
        print(False)
    else:
        midpoint = len(set) // 2
        #print(midpoint)
        if set[midpoint] == number:
            print(True)
        else:
            if number < set[midpoint]:
                if is_member(set[:midpoint], number) == True:
                    print(True)
            elif number > set[midpoint]:
                if is_member(set[:midpoint+1:], number) == True:
                    print(True)
            else:
                print(False)


testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]

is_member(testlist, 3)
is_member(testlist, 19)

1 个答案:

答案 0 :(得分:0)

由于以下情况,您当前的递归程序无法运行 -

if is_member(set[:midpoint+1:], number) == True:

即使midpoint0,也会将is_member()切换为set切换为 - set[:1:] - 这将是{set中的第一个元素1}}列表。因此,这将继续下去。条件应该是 -

if is_member(set[midpoint+1:], number) == True:

这样您就可以检查midpoint的右侧。

鉴于此,要转换程序以返回结果,您应该返回结果而不是print。示例 -

def is_member(set, number):
    if len(set) == 0:
        return False
    midpoint = len(set) // 2
    if set[midpoint] == number:
        return True
    if number < set[midpoint]:
        return is_member(set[:midpoint], number)
    elif number > set[midpoint]:
        return is_member(set[midpoint+1:], number)
    return False

演示 -

>>> def is_member(set, number):
...     if len(set) == 0:
...         return False
...     midpoint = len(set) // 2
...     if set[midpoint] == number:
...         return True
...     if number < set[midpoint]:
...         return is_member(set[:midpoint], number)
...     elif number > set[midpoint]:
...         return is_member(set[midpoint+1:], number)
...     return False
...
>>> testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
>>>
>>> is_member(testlist, 3)
False
>>> is_member(testlist, 19)
True
>>> is_member(testlist, 100)
False
>>> is_member(testlist, 42)
True