如果列表已排序,则使用python 3进行递归布尔检查

时间:2012-07-23 21:21:57

标签: python recursion python-3.x sortedlist

我正在尝试编写一个递归函数,如果列表已排序,则执行布尔检查。如果列表已排序则返回true,否则返回false。到目前为止,我试图理解我的“基本情况”是否正确(即我的第一个'if'陈述):

def isSorted(L, i=[]):
    if L[i] > L[i + 1]:
         return false
    else:
         return true

我的初始if "L[i] > L[i + 1]:"作为递归的基本情况是否正确?

假设我的'基本情况'是正确的,我不知道如何递归地确定列表是否按非降序排序。

4 个答案:

答案 0 :(得分:1)

这是我想出的。我将默认列表指定为0;首先检查第一项是否是最后一项。如果没有,应检查每个项目,直到它到达列表的末尾。

def isSorted(L):
    # Base case
    if len(L) == 1:
        return True

return L[0] <= L[1] and isSorted(L[1:])

答案 1 :(得分:0)

这就是我的开始。编写具有以下签名的函数:

function isSorted(currentIndex, collection)

在函数内部,检查currentIndex是否在集合的末尾。如果是,则返回true。

接下来,检查collection[index]collection[index+1]是否排序正确。

如果不是,则返回false 如果是,请返回isSorted(currentIndex+1, collection)

警告:这对于递归非常糟糕

答案 2 :(得分:0)

不,基本情况是当你到达列表的末尾时,在这种情况下你返回true。

否则,如果您正在查看的两个元素无序,则返回false。

否则,在列表中的下一个元素上返回递归调用的结果。

答案 3 :(得分:0)

我同意@MStodd:递归不是在Python中解决这个问题的方法。对于很长的列表,Python可能会溢出它的堆栈!但是对于短名单,它应该没问题,如果你的老师给你这个问题,你需要这样做。

以下是您应该如何思考这个问题。每次递归调用你都应该做以下三件事之一:0)返回False,因为你发现列表没有排序; 1)返回True因为你已经达到基本情况; 2)打破工作并以某种方式缩小剩余问题,直到达到基本情况为止。基本情况是工作无法进一步细分的情况。

这是一个大致的概述:

def recursive_check(lst, i):
    # check at the current position "i" in list
    # if check at current position fails, return False
    # update current position i
    # if i is at the end of the string, and we cannot move it any more, we are done checking; return true
    # else, if i is not at the end of the string yet, return the value returned by a recursive call to this function

例如,这是一个检查字符串中是否有字符'@'的函数。如果字符串中的任何位置没有True,则应返回@

def at_check(s, i):
    if s[i] == '@':
        return False
    i += 1
    if i >= len(s):
        return True
    else:
        return at_check(s, i)

我上面写的与上面给出的大纲完全相同。这是一个略短的版本,可以完成相同的操作,但不是完全相同的顺序。

def at_check(s, i=0):
    if i >= len(s):
        return True
    if s[i] == '@':
        return False
    return at_check(s, i+1)

编辑:请注意我将i=0放入at_check()的参数中。这意味着i的“默认”值将为0.调用此函数的人只能调用at_check(some_string)并且不会为第一次调用显式传入0;默认参数将提供前0个参数。

我们真正需要向i添加一个是我们递归调用函数的唯一时间。我们添加1的部分是重要的“分解工作”部分。我们尚未检查的字符串部分是i之后的部分,每次调用时该部分变小。我不知道你是否已经学会了“切片”,但是我们可以使用“切片”来实际使每次调用时字符串越来越小。这是一个以这种方式工作的版本;如果你还不知道切片,请忽略它。

def at_check(s):
    if s == '':  # empty string
        return True
    if s[-1] == '@':  # is last character '@'?
        return False
    return at_check(s[:-1]) # recursive call with string shortened by 1

在此版本中,空字符串是基本情况。空字符串不包含@,因此我们返回True。然后,如果最后一个字符为@,我们可以返回False;但否则我们会砍掉最后一个字符并递归调用该函数。在这里,我们通过字面意思使字符串变得更短和更短来打破工作,直到我们完成。但是在索引变量中加1,并通过字符串移动索引也是一回事。

研究这些示例,直到您了解使用递归来分解工作并在每次递归调用上取得一些进展。然后看看你是否可以弄清楚如何将这个想法应用于查找列表是否已排序的问题。

祝你好运!