2014-09-03 3 views
0
이 같은 파이썬에 재귀 순차적 인 검색을 구현하고

를 반환하지 않습니다재귀 순차 검색 값

def search(list1,n,pos): 
    if n==list1[0]: 
     return pos 
    else: 
     if list1==[]: 
      return -1 
     else: 
      pos=pos+1 
      list1.pop(0) 
      return search(list1,n,pos) 

def searchCall(n): 
    anylist=[1,2,3,4,5,6,7,8,9,10] 
    pos=0 
    search(anylist,n,pos) 

def main(): 
    i=searchCall(8) 
    print i 

if __name__=="__main__": 
    main() 

그래서 목록에있는 요소 N을 발견하는 것입니다, 각 재귀 호출에 무엇을 목록의 첫 번째 요소가 튀어 나와 나머지 목록이 다시 검색됩니다. 문제는 그 나는이 둘 때 :

if n==list1[0]: 
     print pos 

가이 요소가 발견 된 위치를 인쇄,하지만 난 변경할 때

return pos 

가 없음을 또한

때 요소를 인쇄합니다을 찾을 수 없습니다 -1 반환해야하지만 대신이 오류 메시지를 표시합니다.

if n==list1[0]: 
IndexError: list index out of range 

어떤 도움말? 요소가 발견되지 않는 경우

감사

답변

4

, 당신은 목록에있는 모든 항목을 팝, 그래서 길이는 처음에 그 조건을 확인해야합니다 것을 의미 0입니다 :

def search(list1,n,pos): 
    if list1==[]: 
     return -1 

    if n==list1[0]: 
     return pos 
    else: 
     pos=pos+1 
     list1.pop(0) 
     return search(list1,n,pos) 

def searchCall(n): 
    anylist=[1,2,3,4,5,6,7,8,9,10] 
    pos=0 
    print search(anylist,n,pos) 

EDIT : 이녹스가 말한대로 searchCall으로 전화를 걸 때만 유용합니다. 매번 새로운 목록을 생성하기 때문에 search은 건초 더미를 소비하므로 일회성 검색입니다.

2

주의해야합니다.

먼저 값이있을 때 함수가 예상대로 작동합니다. 방금 list1 = [1,2,3,4,5]를 수행하고 search (list1,3,0)를 호출하고 2를 답으로 받았습니다.

구현의 한 가지 문제점은 목록의 값을 팝하는 것입니다. 따라서 목록을 재사용하려고하면 불완전 할 것입니다. 검색 호출 후 list1은 [3,4,5]입니다.

초. 값이 목록에없는 경우 구현이 잘못되었습니다. 기본적으로 n == list [0] 앞에 list1 == [] check (또는 len (list1) == 0)을 수행해야합니다.

2

search(anylist,n,pos) 값을 반환하지 않았기 때문에 그 이유는 None 만 인쇄하기 때문입니다. 함수 자체가 아무 것도 반환하지 않았으므로 결과를 인쇄하려고 할 때 None입니다. search의 결과를 반환하면 searchCall 기능의 결과를 인쇄 할 수 있습니다.

당신은에 기능을 변경해야합니다 :

def searchCall(n): 
    anylist=[1,2,3,4,5,6,7,8,9,10] 
    pos=0 
    return search(anylist,n,pos) 

그리고 먼저 목록이 비어있을 때 경우에 존재하지 않는 목록의 첫 번째 항목을 요구하기 때문에 예외를 얻을.

그래서 내가 먼저 목록이 비어 있는지 여부를 확인하려면 search 기능

def search(list1,n,pos): 
    if list1==[]: 
     return -1 
    elif n==list1[0]: 
     return pos; 
    else: 
     pos=pos+1 
     list1.pop(0) 
     b= search(list1,n,pos) 
     return b; 

이 수정을 제안하고 당신은 계속합니다.

편집 :

은 그냥이 -1

def main(): 
    print searchCall(15); 

인쇄이 main 기능으로 ...이 완료 를 만들기 위해이 main 기능 인쇄 3

def main(): 
    print searchCall(4);