這裏的一個可能的方法:
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
Expla國家:
所以,無論何時,我們要編寫一個遞歸函數,我們總是需要考慮以下幾點:
- 我怎樣才能下來把問題分解成更小的步驟?
- 基本情況是什麼? (當我可以停止遞歸?)
- 什麼是遞歸情況? (我什麼時候需要繼續?)
對我來說,第一步總是最棘手的問題 - 解決問題。通常,一旦我們找出這一步,其餘的就會落實到位。
通常有很多不同的方法來解決問題,在某種程度上,你選擇哪一種方法有點武斷。在這種情況下,我選擇通過反覆比較字符串中的前兩個字符來解決問題。
如果兩個字符是有序的,那麼我重複這個過程,除了我刪除第一個字符。如果我的字符串中只剩下一個字符,或者前兩個字符出現故障,我知道我可以停止並分別返回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
方法準確地告訴你,如果該字符串的其餘部分(除了前兩個字符)是正確的排序與否。這有點奇怪 - 感覺就像我們從未明確告訴代碼如何確定字符串是否被編碼,或者傳遞了任何信息,但是它確實如此!
但是,這是遞歸美的一部分:只要我們正確地定義了基本案例和遞歸案例,它就會神奇地工作。
爲什麼遞歸函數?因爲它的功課? – thefourtheye
Yeap,我目前是一位剛接觸這門語言的學生。我想要一些幫助! – user2559679
對不起,但你需要展示你已經嘗試過什麼,以及在我們爲你做功課之前遇到了什麼具體問題。 – mhlester