非再帰的ソリューション:
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
(要素が0または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 "))
入力
abc
bac
出力
String? abc is abcdearian
String? bac is not abcdearian
String?