2013-07-23 2 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

두 번째 코드 세트가 작동합니다. 첫 번째 편집 된 코드는 '거짓'대신 '없음'을 반환합니다. – AppliedNumbers

+0

none은 허위 값입니다. 그래서'if None :'을 말하는 것은 본질적으로'if False'를 말하는 것과 같습니다 ... 그렇지만'if None == False'와 일치하지 않습니다. \ –

+0

확실히. 코드는 동일하게 작동하지만 출력이 중요하다는 것도 알고 있어야합니다. – AppliedNumbers

2

@Joran의 재귀 호출 가까이하려는 Beasley의 대답은 정확하지만 조금 더 빨라야하는 문제에 대한 또 다른 해결책이 있습니다 :

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

'len (l) == 0'을'l'로 바꿀 수 있습니다. – Blender

+0

@Blender 감사합니다. 원래 len (l) <= 1'로 사용 했었고 그것을 고칠 때 그것을 잊어 버렸습니다. –

+0

@Blender'len (l)'이 적어도 1 일 때'if 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:])