2014-02-12 80 views
0

我想定義一個遞歸函數傳遞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 
+1

爲什麼遞歸函數?因爲它的功課? – thefourtheye

+0

Yeap,我目前是一位剛接觸這門語言的學生。我想要一些幫助! – user2559679

+4

對不起,但你需要展示你已經嘗試過什麼,以及在我們爲你做功課之前遇到了什麼具體問題。 – mhlester

回答

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 

Expla國家:

所以,無論何時,我們要編寫一個遞歸函數,我們總是需要考慮以下幾點:

  1. 我怎樣才能下來把問題分解成更小的步驟?
  2. 基本情況是什麼? (當我可以停止遞歸?)
  3. 什麼是遞歸情況? (我什麼時候需要繼續?)

對我來說,第一步總是最棘手的問題 - 解決問題。通常,一旦我們找出這一步,其餘的就會落實到位。

通常有很多不同的方法來解決問題,在某種程度上,你選擇哪一種方法有點武斷。在這種情況下,我選擇通過反覆比較字符串中的前兩個字符來解決問題。

如果兩個字符是有序的,那麼我重複這個過程,除了我刪除第一個字符。如果我的字符串中只剩下一個字符,或者前兩個字符出現故障,我知道我可以停止並分別返回TrueFalse

例如,如果我們可以形象地調用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 

那麼,這裏是三個步驟的答案:

  1. 如何將問題分解爲更小的步驟?
    保持比較前兩個字符

  2. 什麼是基本情況? (我什麼時候才能停止遞歸?)
    既可以當兩個字符都失靈,或者如果我只有一個字符左

  3. 什麼是遞歸的情況? (我什麼時候需要繼續?)
    如果我的字符串中剩下兩個或更多字符。

注意遞歸情況下總是需要一個「信仰的飛躍」 - 你必須相信調用is_sorted方法準確地告訴你,如果該字符串的其餘部分(除了前兩個字符)是正確的排序與否。這有點奇怪 - 感覺就像我們從未明確告訴代碼如何確定字符串是否被編碼,或者傳遞了任何信息,但是它確實如此!

但是,這是遞歸美的一部分:只要我們正確地定義了基本案例和遞歸案例,它就會神奇地工作。

+0

不應該是'<='? – Christian

+0

@Christian - 啊謝謝,修正。 – Michael0x2a

+0

啊非常翔實!得到它了! – user2559679

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 
+0

對我來說,使用「」.join(sorted())迭代會很容易,但事實證明我必須用遞歸來完成。我只能傳遞一個參數。 – user2559679

+0

@ user2559679檢查答案中的第一個例子,即遞歸。 – thefourtheye

0

沒有更少的編程邏輯!

- >拆分字符串數組,併發送此陣列起作用

- >我們可以很容易地將它們轉換爲相應的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; 
} 
+1

我相信OP是學習python的,所以這個問題是python特有的。 – msvalkon