【问题标题】:Difficulty returning values with recursive functions递归函数难以返回值
【发布时间】:2015-10-26 06:49:52
【问题描述】:

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

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

【问题讨论】:

  • 您可能难以返回值,因为您在任何时候都不会从您的函数中返回任何内容。
  • + 当 set 的长度变为 0 时,if 条件无限运行。 set 的长度 if never

标签: python recursion


【解决方案1】:

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

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

即使 midpoint 是 0 ,这也会调用 is_member() 并将 set 切片作为 - 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

【讨论】:

  • 返回布尔值 True 和 False 会在 shell 之外打印它们吗?当这个函数完全运行时,它必须打印值 True 和 False 并且从我收集的“返回”中只在 shell 中打印。
  • 不,它不会,只需将返回值打印为 - print(is_member(testlist, 42)) 。
猜你喜欢
  • 2013-09-29
  • 2017-07-26
  • 2020-10-10
  • 2021-06-11
  • 2012-03-11
  • 2017-05-14
  • 2014-07-13
  • 2017-09-24
相关资源
最近更新 更多