<p>以下是一种可能的方法:</p>
<pre><code>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
</code></pre>
<hr/>
<p>说明:</p>
<p>因此,每当我们要编写递归函数时,我们总是需要考虑以下几点:</p>
<ol>
<li><strong>如何将问题分解成更小的步骤?</strong></li>
<li><strong>什么是基本情况?(何时可以停止递归?)</strong></li>
<li><strong>什么是递归情况?(我什么时候需要继续走?)</strong></li>
</ol>
<p>对我来说,第一步总是解决问题最棘手的一步。通常,一旦我们弄清楚这一步,其余的就都安排好了。在</p>
<p>通常有很多不同的方法来分解一个问题,在某种程度上,你选择哪一个有点武断。在本例中,我选择通过反复比较字符串中的前两个字符来分解问题。在</p>
<p>如果这两个字符是有序的,那么我重复这个过程,除了删除第一个字符之外。如果字符串中只剩下一个字符,或者前两个字符顺序不对,我知道我可以停止并分别返回<code>True</code>或{<cd2>}。在</p>
<p>例如,如果我们将调用<code>is_sorted('abcd')</code>可视化,它将如下所示:</p>
^{pr2}$
<p>相比之下,如果我们尝试调用<code>is_sorted('azbc')</code>,它看起来像这样:</p>
<pre><code>call is_sorted('azbc')
'a' is less then 'z'
call is_sorted('zbc')
'z' is NOT less than 'b', return False
return False
</code></pre>
<p>那么,下面是三个步骤的答案:</p>
<ol>
<li><p><strong>如何将问题分解成更小的步骤?</strong><br/>
继续比较前两个字符</p></li>
<li><p><strong>什么是基本情况?(何时可以停止递归?)</strong><br/>
如果两个字符顺序不对,或者我只剩下一个字符</p></li>
<li><p><strong>什么是递归情况?(我什么时候需要继续走?)</strong><br/>
如果我的字符串中还有两个或更多的字符。</p></li>
</ol>
<p>注意,递归的情况总是需要一个“信心的飞跃”,您必须相信调用<code>is_sorted</code>方法将准确地告诉您字符串的其余部分(除了前两个字符)是否正确排序。感觉有点奇怪,感觉好像我们从来没有明确告诉代码如何确定字符串是否编码,或者传递任何信息,但它无论如何都是这样做的!在</p>
<p>然而,这正是递归之美的一部分:只要我们正确地定义了基本情况和递归情况,它就会神奇地工作。在</p>