非递归解决方案:
def issorted(L):
return all(x <= y for x, y in zip(L, L[1:]))
要创建递归函数,您应该找到一种方法将问题拆分为可以以相同方式解决的更小和/或更简单的子问题:
#!/usr/bin/env python3
from string import ascii_lowercase
def abcdearian(s):
return issorted_recursive([c for c in s.lower() if c in ascii_lowercase])
def issorted_recursive(L):
return L[0] <= L[1] and issorted_recursive(L[1:]) if len(L) > 1 else True
这issorted_recursive()
是一个递归函数。基本情况是len(L) <= 1
(具有零或一个元素的列表始终排序,因此True
在这种情况下返回)。在递归情况下 ( len(L) > 1
),L
如果第一项按排序顺序 ( L[0] <= L[1]
)并且列表的其余部分 ( L[1:]
) 也已排序,则认为列表已排序。每次函数接收越来越小的输入,直到找到乱序元素(L[0] > L[1]
)或遇到基本情况并且函数完成。
while True:
s = input("String? ")
if not s:
break
print("{} is {}abcdearian".format(s, "" if abcdearian(s) else "not "))
输入
美国广播公司
背书
输出
String? abc is abcdearian
String? bac is not abcdearian
String?