我想定义一个递归函数,该函数传递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
答案 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
说明:
所以,无论什么时候,我们想写一个递归函数,我们总是需要考虑以下几点:
对我来说,第一步始终是最棘手的 - 打破问题。通常,一旦我们弄清楚这一步,其余的就会到位。
通常有很多不同的方法来解决问题,在某种程度上,你选择哪一种方法有点武断。在这种情况下,我选择通过反复比较字符串中的前两个字符来解决问题。
如果这两个字符是有序的,那么我重复这个过程,除了我删除第一个字符。如果我的字符串中只剩下一个字符,或者前两个字符出现故障,我知道我可以停止并分别返回True
或False
。
例如,如果我们可视化调用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
那么,以下是这三个步骤的答案:
如何将问题分解为更小的步骤?
继续比较前两个字符
什么是基本情况? (当我可以停止递归?)
当两个角色出现故障或者我只剩下一个角色时
什么是递归案例? (我什么时候需要继续?)
如果我的字符串中还剩下两个或更多字符。
请注意,递归情况总是需要“信仰的飞跃” - 你必须相信调用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;
}