【问题标题】:Recursively Identifying Sorted Lists递归识别排序列表
【发布时间】:2013-07-23 04:54:57
【问题描述】:

作为一个递归练习练习,我正在编写一个 Python 函数,它递归地识别输入列表是否按从小到大排序,仅实数,然后返回一个布尔值。

我的代码是:

def det_sorted(listA):
    if len(listA) == 1:
        return(True)
    else:
        if listA[0] <= det_sorted(listA[1:]):
            return(True)
        elif listA[0] > det_sorted(listA[1:]):
            return(False)

此函数始终返回“False”。一般问题:如何正确递归地遍历列表?我的具体问题:我在这里做错了什么?

【问题讨论】:

  • 我的第一个答案是“你不知道”。由于您已经有sorted() 可用,所以其他任何事情都更加复杂和昂贵。
  • 查看问题所在的一种简单方法是意识到对sorted() 的任何调用都将返回TrueFalse,并且您的if 语句正在对@ 进行不等式检查987654327@ 或False。这不是你想要的。
  • 你不应该称它为sorted(),因为这会影响内置函数。 is_sorted() 会很好。
  • 1) 永远不要使用已被内置函数使用的名称 2) 谓词(即返回 True/False 输入条件的函数)的名称应该以动词开头现在时:例如is_sortedhas_fruitscan_killhas_moo_powers。执行动作的函数应该有动词/句子作为名称:sortgrow_fruitskilluse_moo_powers。使用过去时可能表明该操作未就地进行(例如,sorted 表明返回的值已排序,而不是原始序列正在排序)。
  • @bakuriu 啊。很高兴知道。我会做出这些改变。

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


【解决方案1】:

你很接近,你想调用递归来返回

else:
        if listA[0] <= listA[1]:
             return sorted(listA[1:])

或者你可以将两个语句合并到 return 中(并去掉 else)

return  listA[0] <= listA[1] and sorted(listA[1:])

【讨论】:

  • 第二组代码有效。不过,第一个编辑的代码返回“None”而不是“False”。
  • none 是一个假值...所以说if None: 与说if False 基本相同...但它不会匹配if None == False\
  • 当然。代码的工作原理相同,但了解输出也很重要。
【解决方案2】:

@Joran Beasley 的回答是正确的,但这里有另一个解决问题的方法,应该更快一点:

def is_sorted(l, prev=None):
    if l:
        if prev is None: return is_sorted(l[1:], l[0])
        else: return l[0] > prev and is_sorted(l[1:], l[0])
    else:
        return True

【讨论】:

  • 您可以将 len(l) == 0 替换为 l
  • @Blender 谢谢,我最初的名字是len(l) &lt;= 1,但在我修复它时忘记更改它。
  • @Blender if l: 将评估为 True,只要 len(l) 至少为 1。你的意思是不是 if not l
  • 糟糕!固定的。我切换了语句的顺序,因为我更喜欢将if l 写成if not l
  • 请注意,None 用于负无穷大,() 用于正无穷大在 Python 2 中在 Python 3 中不起作用。在 Python 2 中,() &gt; 0 &gt; NoneTrue,如Python 3,结果为TypeError: unorderable types。由于这个答案中的代码可以在 Python 2 上正常工作,但由于 OP 的标签指定 Python 3,这将不起作用。
【解决方案3】:

您的函数没有考虑listA 为空的情况,它应该评估为已排序。所以完整的功能应该是这样的:

def is_sorted(listA):
  if len(listA) == 0 and len(listA) == 1:
      return True
  else:
      return  listA[0] <= listA[1] and is_sorted(listA[1:])

这可以缩短一点:

def is_sorted(listA):
  if not (listA and listA[1:])
      return True
  return listA[0] <= listA[1] and is_sorted(listA[1:])

【讨论】:

    【解决方案4】:

    这是一个非常明确的脚本。

    def det_sorted(listA):
        if len(listA) == 1:
            return(True)
        else:
            if det_sorted(listA[1:]) == True:
                if listA[0] <= listA[1]:
                    return(True)
                elif listA[0] > listA[1]:
                    return(False)
            else:
                return(False)
    

    【讨论】:

    • 虽然有点长。
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多