【问题标题】:Return list[i] = i index of a list返回列表[i] = 列表的 i 索引
【发布时间】:2016-04-17 10:33:19
【问题描述】:

我正在尝试在 Python 中做一个递归程序,它返回等于它的值的列表的第一个索引,例如:[0,1,5,6] 返回 0。但是当我通过最后一个列出它返回1,我不知道为什么。

代码:

def index(list):
    """Returns the first index of the list where list[i] == i"""
    return __auxindex(list, 0, len(list) - 1)


def __auxindex(list, start, end):
    if start < end:
        half = (start + end) // 2
        if list[half] == half:
            return half
        elif list[half] > half:
            return __auxindex(list, start, half)
        else:
            return __auxindex(list, half + 1, end)
    else:
        return start

list = input('Values (, ): ').split(', ')
list = [int(i) for i in list]
print(index(list))

编辑:我忘记了必须对列表进行排序。所以这段代码有效。

【问题讨论】:

  • 它是总是这样做,还是只针对某些输入?如果是后者,是哪些?无论哪种情况,它应该返回什么?
  • 有时会这样,当我第一次通过 [0, 1, 5, 6] 时它返回 0,但当我再次通过时返回 1
  • 不要使用列表作为变量名,如果匹配索引处没有元素怎么办?我也得到 1 [0, 1, 5, 6] 而不是 0
  • 当递归函数不能满足您的要求时,添加一两个打印调用会很有帮助,以确保每个递归调用中的参数都是您期望的。请参阅here 了解我前几天写的一个简单示例。
  • 但是,我真的看不出这里使用递归的意义。您想要第一个 ilst[i]==i,所以简单的线性搜索是自然的解决方案。

标签: python


【解决方案1】:

您在中途开始索引。由于您使用了楼层除法,因此索引为1。好吧,您在索引1 处的列表是1,所以这是一个匹配项,它返回half1。相反,您需要做的是从头开始并工作到最后。像这样的:

def index(number_list, start=0):
    if start >= len(number_list):
        return -1
    elif number_list[start] == start:
        return start
    else:
        return index(number_list, start+1)

【讨论】:

  • 是的,但 OP 需要递归解决方案。我怀疑你被否决了,因为你的解决方案不是递归的。
  • 但是OP的重点是我必须使用分而治之
  • @MarcoCanora:如果你想要 first 出现,你需要从头开始。如果从中间开始找到匹配项,则返回匹配项,不一定是第一个。
  • @MarcoCanora:即使列表是有序的,zondo 所说的在中间找到匹配项仍然适用。
  • @MarcoCanora :如果保证列表已排序,那么您可以在number_list[start] &gt; start 尽早退出,因为该条件也适用于列表中的每个后续项目。顺便说一句,我在之前的评论中忘了提及:要获取或设置递归限制,请使用 sys.getrecursionlimitsys.setrecursionlimit
猜你喜欢
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2020-10-21
  • 2019-09-12
  • 2023-03-08
相关资源
最近更新 更多