【问题标题】:Why does this function that finds the min and max of an unordered list not work in certain scenarios?为什么这个查找无序列表的最小值和最大值的函数在某些情况下不起作用?
【发布时间】:2019-09-22 23:46:26
【问题描述】:

此代码应该通过将列表分成两半来递归地找到无序列表的最小值和最大值。一半一次,它在每一半上再次调用该函数。有两个例外,如果列表只有 1 个项目,它只会将该项目作为最小值和最大值返回。如果列表有两个项目,那么它直接比较这两个项目并返回适当的最小值和最大值。这是代码。

import random

unordered = [5, 2, 3, 1, 4]
#x = 0
#while x < 10:
#   unordered.append(random.randrange(0,100))
#   x += 1

print(unordered)

def minMax(x):
    if len(x) == 1:
        return x[0], x[0]
    if len(x) == 2:
        if x[0] > x[1]:
            max_ = x[0]
            min_ = x[1]
        else:
            max_ = x[1]
            min_ = x[0]
        return max_, min_
    if len(x) > 2:
        global min_, max_, maxA, maxB, minA
        a = x[:len(x)//2]
        b = x[len(x)//2:]
        maxA, minA = minMax(a)
        maxB, minB = minMax(b)
        if maxA > maxB:
            max_ = maxA
        if maxB > maxA:
            max_ = maxB
        if minA < minB:
            min_ = minA
        if minB < minA:
            min_ = minB
        return max_, min_

print(minMax(unordered))

由于某种原因,这会返回 (4, 1)。 当我设置 unordered = [1, 2, 3, 4, 5] 时,它认为 3 是最小值,但它正确地将 5 识别为最大值。

【问题讨论】:

  • global min_, max_, maxA, maxB, minA 是怎么回事?为什么要使用全局变量?
  • (你也忘了minB。)
  • 您没有处理maxAmaxB 相等的情况(分钟相同)。诚然,这不是这个列表的问题,但在某些情况下会出现问题。
  • 全局变量和递归不能混用。
  • @Retsek:你的递归调用在彼此的数据上都被跺脚,因为它们试图共享同一组全局变量。

标签: python python-3.x list recursion comparison


【解决方案1】:

因为unordered 是一个列表。为什么不用Python's max function,而不是自己写?

&gt;&gt;&gt; unordered = [5, 2, 3, 1, 4]

&gt;&gt;&gt; max(unordered)

5

否则为什么不做一些简单的事情

def min(list): min = none for x in list: if min == none: min = x elif x < min: min = x return min

【讨论】:

  • 是的,抱歉,我应该说清楚。我知道 Python 有它自己的 max 函数,但作为一个学习练习,我试图自己做。
猜你喜欢
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2013-09-28
  • 2015-09-29
相关资源
最近更新 更多