2017-11-09 1 views
0

나는 한동안 그것을보고 있었고 나의 이분 탐색에 잘못된 점을 알 수 없다. 내가 실행하면 'RecursionError : 최대 재귀 깊이가 비교 대상을 초과했습니다'라고 표시됩니다. 아무도 볼 수 없었고 아래에서 무엇이 잘못되었는지 보았습니까? 고맙습니다! 목록 길이가 최종 else 경우, 재귀가 같은과, 다시 같은 목록 (크기)를 얻을 것이다 실제 하나입니다 지금 경우 1. 다음 중간이 0이 될 것입니다 때 발생하는 상상python bisection search exercise

#Write a function called in_bisect 
#that takes a sorted list and a target value 
#and returns the index 
#of the value in the list if it’s there 

def in_bisect(t, word): 

    if len(t) == 0: 
     return False 

    middle = len(t) // 2 

    if t[middle] == word: 
     return middle 

    elif t[middle] > word: 
     return in_bisect(t[:middle], word) 
    else: 
     return in_bisect(t[middle:], word) 


if __name__ == "__main__": 
    fruits = ['apple', 'banana', 'kiwi', 'peach', 'watermelon'] 

    in_bisect(fruits, 'banana') 
    in_bisect(fruits, 'ewf')   
+0

무한 재귀를 피하기 위해 재귀 할 때 중간을 제외해야합니다. 마지막 사례에서 제외하는 것을 잊었습니다. –

+0

btw,'return t [middle] '대신에'return middle' –

답변

3

결과 ... 무한 재귀.

해결 방법 : 이미 middle 자체가 더 이상 후보임을 알지 그 순간으로 middle에 하나를 추가 : 파이썬 루프에 꼬리 재귀를 변환 할 수 있기 때문에

else: 
    return in_bisect(t[middle+1:], word) 
+0

아하! 이제 왜 당신의 설명에 감사드립니다! – hellocsk

0

내가 대신 재귀 여기에 루프을 사용하고 재귀 깊이가 매우 낮습니다.

나는 wordt이고 다른 경우는 False 인 것으로 확인합니다.

def in_bisect(t, word): 
    def iterator(start, end): 
     # loop will terminate when exactly start = end - 1 
     while start < end - 1: 
      middle = (start + end) // 2 
      if t[middle] == word: 
       return middle 
      elif t[middle] > word: 
       end = middle 
      else: 
       start = middle + 1 
     # here we need to check wheither the last element in the list is the one we search for 
     return start if t[start] == word else False 

    # if len(t) is zero, our inner function would raise IndexError so we check it explicitly 
    if len(t) == 0: 
     return False 
    return iterator(0, len(t)) 
+0

코드 주셔서 감사합니다! 재귀에 대한 파이썬의 한계를 알지 못했고 또 다른 def 내부에서 def를 보지 못했습니다. 어떻게 이런 식으로 작성 될 수 있는지 보시면 도움이됩니다. – hellocsk

+0

기본 제한은 1000 AFAIK이지만 원하는 경우 변경할 수 있습니다. 어쨌든 파이썬 개발자는 명령 패러다임을 선호합니다. 그들은'builtins'에서'functools' 모듈로'reduce'와 같은 기능적인 것을 옮겼고 꼬리 재귀 최적화를 지원하지 않을 것이라고 생각합니다. 제 생각에 파이썬에서 기능 스타일을 사용하지 않는 것이 낫습니다 :-) – Sergey