具有字母顺序的递归函数

时间:2014-02-12 07:07:39

标签: python sorting recursion

我想定义一个递归函数,该函数传递str并返回bool,告诉参数中的字符是否按字母顺序排列。

如果我定义了sortfunc('abcdefg'),就会返回True;并sortfunc('banana')将返回False

我该如何处理?这就是我到目前为止......但我有点卡住了。我理解递归的概念,但我不知道如何实现它。

def sortfunc(s):
    if s == '':
        return False
    else:
        return True if s[0] < s[1:] else False

3 个答案:

答案 0 :(得分:3)

这是一种可能的方法:

def is_sorted(s):
    if len(s) == 1:
        return True               # Base case
    elif s[0] <= s[1]:
        return is_sorted(s[1:])   # Recursive case
    else:
        return False              # Base case

说明:

所以,无论什么时候,我们想写一个递归函数,我们总是需要考虑以下几点:

  1. 如何将问题分解为更小的步骤?
  2. 什么是基本情况? (当我可以停止递归?)
  3. 什么是递归案例? (我什么时候需要继续?)
  4. 对我来说,第一步始终是最棘手的 - 打破问题。通常,一旦我们弄清楚这一步,其余的就会到位。

    通常有很多不同的方法来解决问题,在某种程度上,你选择哪一种方法有点武断。在这种情况下,我选择通过反复比较字符串中的前两个字符来解决问题。

    如果这两个字符是有序的,那么我重复这个过程,除了我删除第一个字符。如果我的字符串中只剩下一个字符,或者前两个字符出现故障,我知道我可以停止并分别返回TrueFalse

    例如,如果我们可视化调用is_sorted('abcd'),它看起来像这样:

    call is_sorted('abcd')
        'a' is less then 'b'
        call is_sorted('bcd')
            'b' is less then 'c'
            call is_sorted('cd')
                'c' is less then 'd'
                call is_sorted('d')
                    only one character left, return True
                return True
            return True
        return True
    

    相反,如果我们尝试调用is_sorted('azbc'),它看起来像这样:

    call is_sorted('azbc')
        'a' is less then 'z'
        call is_sorted('zbc')
            'z' is NOT less than 'b', return False
        return False
    

    那么,以下是这三个步骤的答案:

    1. 如何将问题分解为更小的步骤?
      继续比较前两个字符

    2. 什么是基本情况? (当我可以停止递归?)
      当两个角色出现故障或者我只剩下一个角色时

    3. 什么是递归案例? (我什么时候需要继续?)
      如果我的字符串中还剩下两个或更多字符。

    4. 请注意,递归情况总是需要“信仰的飞跃” - 你必须相信调用is_sorted方法会准确地告诉你字符串的其余部分(前两个字符除外)是否正确是否排序。这有点奇怪的感觉 - 感觉就像我们从未明确地告诉代码如何确定字符串是否被编码,或传递给任何信息,但它仍然这样做!

      然而,这是递归之美的一部分:只要我们正确地定义基本情况和递归情况,它就会神奇地起作用。

答案 1 :(得分:1)

在您的尝试中,您错过了递归部分。请检查以下实现。

def sortfunc(current_string, previous_character = ""):
    if current_string == "":
        return True         # Base condition
    if previous_character and previous_character > current_string[0]:
        return False        # Failure case
    return sortfunc(current_string[1:], current_string[0])  # Recursion

如果您想知道如何在没有递归的情况下执行此操作,

def sortfunc(current_string):
    return "".join(sorted(current_string)) == current_string

示例运行

print sortfunc('abcdefg')   # True
print sortfunc('banana')    # False

答案 2 :(得分:0)

没有更少的编程逻辑!

- &GT;将字符串拆分为数组并将此数组发送到函数

- &GT; 我们可以通过将值转换为相应的ascii值来轻松比较值

sortfunc(str) {

for(int i=0;i<str.length;i++){

if ( (int) str[i] >(int) str[i+1] ) {
result = true
}
else
result = false;

return result;
}