当前位置: 代码迷 >> python >> 递归函数很难返回值
  详细解决方案

递归函数很难返回值

热度:124   发布时间:2023-06-16 10:23:07.0

因此,我正在编写一个递归函数,以使用二进制搜索算法确定列表中整数的隶属关系,并且一旦函数完成其递归,就很难返回/打印一个值。 老实说,我很难绕过递归。 每当我运行程序时,它都会无限次输出错误消息的一半。 我的问题似乎是,如果该项目未通过递归测试,则它并不真正知道何时停止失败,而只是继续打印失败情况/出现的错误消息。

程序一旦完成运行就必须打印出条件,因此如果我说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)

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

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

即使midpoint0 ,它也会调用is_member()并将set切片设为is_member() set[:1:] -这将是set列表中的第一个元素。 因此,这将继续下去。 条件确实是-

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
  相关解决方案