2013-07-23 60 views
3

作爲遞歸練習練習,我正在編寫一個Python函數,它遞歸地標識輸入列表是否從最小到最大的實數排序,然後返回一個布爾值。遞歸識別排序列表

我的代碼是:

def det_sorted(listA): 
    if len(listA) == 1: 
     return(True) 
    else: 
     if listA[0] <= det_sorted(listA[1:]): 
      return(True) 
     elif listA[0] > det_sorted(listA[1:]): 
      return(False) 

此函數始終返回 '假'。一般問題:我如何正確遞歸遍歷列表?我的具體問題是:我在這裏做錯了什麼?

+2

我的第一個答案是「不這樣做」。既然你已經有了'sorted()',其他任何東西都更加複雜和昂貴。 – msw

+0

查看錯誤的簡單方法是意識到任何對「sorted()」的調用都將返回「True」或「False」,並且您的「if」語句對「True」或「False」進行不等式檢查'。這不是你想要的。 –

+6

你不應該把它叫做sorted(),因爲這會影響內置函數。 'is_sorted()'將會很好。 – 2rs2ts

回答

5

你接近,你要撥打的遞歸返回

else: 
     if listA[0] <= listA[1]: 
      return sorted(listA[1:]) 

,或者你可以兩個語句合併成回報率(和擺脫別人的)

return listA[0] <= listA[1] and sorted(listA[1:]) 
+0

第二套代碼工程。雖然第一個編輯後的代碼返回'None'而不是'False'。 – AppliedNumbers

+0

沒有一個是虛假值...所以說'如果None:'基本上與'如果False'一樣......但它不會匹配'如果None == False' \ –

+0

當然。代碼工作原理相同,但知道輸出也很重要。 – AppliedNumbers

2

@Joran比斯利的回答是正確的,但這是另一種解決問題的方法,應該更快一些:

def is_sorted(l, prev=None): 
    if l: 
     if prev is None: return is_sorted(l[1:], l[0]) 
     else: return l[0] > prev and is_sorted(l[1:], l[0]) 
    else: 
     return True 
+2

你可以用'l'替換'len(l)== 0'。 – Blender

+0

@Blender謝謝,我最初把它當作'len(l)<= 1',並且在我修正它時忘了修改它。 –

+0

@Blender只要len(l)至少爲1,如果l:'會評估爲'True'。你是不是指'如果不是l'? – 2rs2ts

0

這是一個非常明確的腳本,可以工作。

def det_sorted(listA): 
    if len(listA) == 1: 
     return(True) 
    else: 
     if det_sorted(listA[1:]) == True: 
      if listA[0] <= listA[1]: 
       return(True) 
      elif listA[0] > listA[1]: 
       return(False) 
     else: 
      return(False) 
+0

雖然有點長。 – AppliedNumbers

0

你的函數不考慮的情況下listA是空的,這應該評估爲排序。因此,全功能應該是這樣的:

def is_sorted(listA): 
    if len(listA) == 0 and len(listA) == 1: 
     return True 
    else: 
     return listA[0] <= listA[1] and is_sorted(listA[1:]) 

這可以縮短一點:

def is_sorted(listA): 
    if not (listA and listA[1:]) 
     return True 
    return listA[0] <= listA[1] and is_sorted(listA[1:])