2012-12-16 2 views
3

목록 구조를 비교하는 함수를 작성하려고합니다 (값은 무관합니다). 문제는 내가 부동 한 두 목록을 가지고 있지만 실제로는 else 부분으로 들어가더라도 함수는 여전히 True을 반환합니다. 나는 왜, 그리고 내가 뭘 잘못했는지 이해하지 못합니다.함수가 "return (False)"후에 중지하지 않습니다.

def islist(p): #is p a list 
    return type(p)==type(list()) 

def ListeIsomorf(a,b): 
    if len(a)==len(b): 
     for i,j in zip(a,b): 
      if islist(i) and islist(j): 
       ListeIsomorf(i,j) 
      elif islist(i) or islist(j): 
       return(False) 
     return(True)  

    else: 
     print(a,"length from the list isn't equal",b) 
     return(False) 

#example lists 
ListeE = [[],[],[[]]] 
ListeD = [[],[],[[]]] 
ListeF = [[[],[],[[]]]] 
ListeG = [[],[[]],[[]]] 
ListeH = [1,[3]] 
ListeI = [1,3] 

#tests 
print(ListeIsomorf(ListeD,ListeE)) # True 
print(ListeIsomorf(ListeD,ListeF)) # False 
print(ListeIsomorf(ListeD,ListeG)) # False 
print(ListeIsomorf(ListeH,ListeI)) # False 

그래서 문제는 세 번째 print(ListeIsomorf(ListeD,ListeG)) # False 발생 : 여기 내 코드입니다. 실제로는 else 부분으로 들어가서 "length from the list isn't equal"을 인쇄하지만 멈추지 않고 return(False)을 제공하지 않습니다. 내가 놓친 게 있니?

  ListeIsomorf(i,j) 

가 반환 된 값을 무시 :

+3

Welcome to Stackoverflow! 들여 쓰기를 수정하십시오 (나는'else' 블록이 들여 쓰기되어 있다고 가정합니다) –

+1

+1, 들여 쓰기를 수정하기 위해 [편집] 링크를 사용하십시오. –

+1

'isinstance (p, list)'를 사용하십시오. - 많은 점에서 더 낫습니다. –

답변

8

문제는 함수가 자신을 재귀 적으로 호출 할 때이다.

따라서 두 번째 수준의 재귀에서 수행되는 비교는 최상위 수준에서 반환되는 결과에 영향을주지 않습니다.

위 변경 :

  if not ListeIsomorf(i,j): 
       return(False) 

수정 문제.

+0

정말 고마워요! 나는 재귀 적 함수가 값을 무시한다는 것을 알지 못했다. 알고있는 것이 좋다. 대단히 감사한다. – Linalein

관련 문제