3

作为一个递归练习练习,我正在编写一个 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”。一般问题:如何正确递归地遍历列表?我的具体问题:我在这里做错了什么?

4

4 回答 4

5

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

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

或者您可以将这两个语句组合到 return 中(并摆脱 else)

return  listA[0] <= listA[1] and sorted(listA[1:])
于 2013-07-23T21:59:08.603 回答
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
于 2013-07-23T22:03:13.097 回答
0

您的函数没有考虑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:])
于 2014-03-13T20:50:45.997 回答
0

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

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)
于 2013-07-24T08:06:02.407 回答