2013-03-22 2 views
0

숫자 목록에서 가장 큰 소수를 찾는 프로그램을 작성 중입니다. 기본적으로 [123, 1233]이있는 목록은 1233에 4 개의 숫자가 있고 최대 크기이기 때문에 4를 반환합니다. 또 다른 예는 [12, 4333, 5, 555555]이 6을 반환하기 때문입니다. 555555에는 6 개의 숫자가 있기 때문입니다.파이썬 리턴 문이 실행되지 않음

여기 내 코드입니다. 이제

def place(listy): 
    if len(listy) == 1: 
     decimal = len(str(listy[0]))  
     print(decimal) 
    else: 
     if len(str(listy[0])) >= len(str(listy[1])): 
      new_list = listy[0:1] 
      for i in listy[2:]: 
       new_list.append(i) 
      place(new_list) 
     else: 
      place(listy[1:]) 

, 내가 print(decimal)를 사용할 때 작동,하지만 난 return decimalprint(decimal)를 변경하는 경우, 그것은 아무것도 반환하지 않습니다. 왜 이런거야? 이 문제를 어떻게 해결할 수 있습니까? 나는 많은 시간을 뛰는 이러한 반환 진술을 보았습니다. 미리 감사드립니다!

+4

소스 코드에 탭과 공백이 섞여있는 것 같습니다. 그건 좋지 않습니다 ... – bernie

+1

return 문과 함께'place (listy)'를 호출하면 인쇄되지 않습니다.'print place (listy)'대신에 반환 된 값을 출력합니다. 당신이하는 일인가요? 귀하의 질문에 조금 막연한 것 같습니다 – That1Guy

+1

"아무것도 반환하지 않음"이란 무엇을 의미합니까? 이 함수를 호출하는 코드를 제공하십시오. – bereal

답변

1

return이 아무 것도하지 않는 것은 아닙니다. 재귀 호출의 반환을 전파하지 않는다는 것입니다.

def place(listy): 
    if len(listy) == 1: 
     decimal = len(str(listy[0]))  
     return decimal 
    else: 
     if len(str(listy[0])) >= len(str(listy[1])): 
      new_list = listy[0:1] 
      for i in listy[2:]: 
       new_list.append(i) 
      return place(new_list) # <-- return added 
     else: 
      return place(listy[1:]) # <-- return added 

모든 레벨에서 인쇄물을 볼 수 있지만 발신자에게 다시 전달하려면 전달해야합니다. 당신이 원하는 모든 정수의 목록의 최대 길이를 찾을 경우

0

, 고려 :

max([len(str(n)) for n in N]) 

예를 들어

N = [1,22,333,4444] 
max([len(str(n)) for n in N]) # Returns 4 

N = [12, 4333, 5, 555555] 
max([len(str(n)) for n in N]) # Returns 6 

참고 :이 내용은 양의 정수에 대해 작동합니다.

또는 단순히 더 : 또한 단지 양의 정수에 대해 작동합니다

len(str(max(N))) 

. 당신은 재귀 호출을 수행 할 때

6

(즉 때 장소를 호출장소와 값을 반환 호출 장소, 다음 호출 장소 (즉 반환 값은 "버블뿐만 아니라 그것을 반환해야합니다 ") 초기 호출자.

그래서 당신은

,691와 모든 재귀 호출을

place(...) 

를 교체해야

return place(...) 

다른 사람들처럼 max()를 사용하는 것과 같은 쉬운 해결책이 있습니다. 재귀 접근 방식을 유지하려면 다음과 같이 내가 코드를 리팩토링 것 :

def place2(listy): 
    if len(listy) < 1: 
     return None 
    elif len(listy) == 1: 
     return len(str(listy[0])) 
    else: 
     v0, v1 = listy[0], listy[1] 
     if v1 > v0: 
      return place2(listy[1:]) 
     else: 
      return place2([listy[0]]+listy[2:]) 

을이 꼬리 재귀하지만, 파이썬은 정말이 방법은 비효율적 인 것 때문에 신경 쓰지 않는다. max()를 사용하거나 루프를 사용하는 것이 파이썬에서 더 좋은 해결책이 될 것입니다.

-2

'전역 변수'(google it)를 사용하여 함수 외부에서 정의 된 변수에 액세스하고 변경하십시오.

+0

누군가이 사이트에 도착하면 해결책을 찾기 전에 마지막 정류장이어야합니다. "Google it"은 도움이되지 않습니다. 제발, [답]을 읽으십시오. – brasofilo