2012-09-21 3 views
0

가능한 복제를 반환하지 :
Why does 'return self' return None?파이썬 함수는 부울 값을

나는 내가 가지고있는 생각 프로젝트 오일러에 (http://projecteuler.net/problem=55) 지금을 문제 55를 해결하기 위해 노력했습니다 대답, 나는 경험을. 나는 문제 55에 대한 해결책을 원치 않는다.

여기 내 코드입니다 : 어떤 도움

t=0 
lychrel=0 
called=0 

def iteratepal(n): 
    global t 
    global called 
    called+=1 
    b = int(''.join(reversed(str(n)))) 
    #print ("n =",n,"\nb =",b,"\nb+n =",b+n,"\n") 

    if ispal(b+n) or ispal(n): 
     t=0 
     return False 

    if t<50: 
     t+=1 
     iteratepal(b+n) 
    else:       # Here's the prob 
     t=0      # this block is executed (because it prints "yea") 
     print("yea")    # but it doesn't return True! 
     return True    # you can try it yourself (even in the interpreter) 

def ispal(n): 
    if n == int(''.join(reversed(str(n)))): 
     return True 
    return False 

print(iteratepal(196)) 

for i in range(0,200): 
    if iteratepal(i)==True: 
     lychrel+=1 
     print(i,"is Lychrel!") 
    else: 
     print(i,"is not a Lychrel!") 
print(lychrel) 

덕분에, 나는이 정말 혼란 스러워요 (난 당신이 모두를 필요가 있다고 생각하지 않습니다).

+0

if t<50: t+=1 iteratepal(b+n) 

을 변경합니다. –

+0

@Martijn Pieters 예, 잊어 버렸습니다. 그것은 전에 False 였고, 얼마 후에 나는 그것을 바 꾸었습니다. –

+0

어떤 경우에'False'를 테스트하는 일반적인 파이썬 방법은'something not :'을 사용하는 것입니다. –

답변

4

당신은 때 t < 50 재귀 함수를 호출하지만 반환 값으로 아무것도하지 않습니다

if t<50: 
    t+=1 
    iteratepal(b+n) 
else:       
    t=0       
    print("yea")    
    return True 

else: 분기가 다음 실행되지 않습니다, 그래서 None 대신 반환됩니다.

if t<50: 
    t+=1 
    return iteratepal(b+n) 
else:       
    t=0       
    print("yea")    
    return True 

몇 가지 더 팁 : if 성명에서 ==True을 테스트 할 필요가 없습니다

  • 가, 다음은 잘 작동합니다 당신은 아마 재귀 호출의 결과를 반환하려면 :

    if iteratepal(i): 
    
  • 당신은 def ispal(n)에서 테스트를 반환 할 수 있습니다 부울 결과 자체, 그냥 테스트없이 그 반환 :

    def ispal(n): 
        return n == int(''.join(reversed(str(n)))) 
    
+0

정말 고맙습니다. 재귀에서, 나는 정말 귀환 포인트를 이해하지 못합니다. 제 말은 새로운 데이터로 함수를 호출하는 것입니다. 왜 반환해야합니까? –

+0

추가 팁을 주셔서 감사합니다! –

+0

@MakisRenieris, 당신이 그것을 돌려 보내지 않는다면 그것은 재귀 적이 지 않다. 한번 호출되면 get은 원래 호출 함수로 리턴되지 않는다. 재귀의 각 반복이 위의 수준으로 반환되지 않을뿐만 아니라 결과가 반환되지 않는다는 것을 의미합니다. – Ben

0

당신은 재귀의 결과를 반환하지 않습니다. 당신은`if` 성명에서`== TRUE '를 테스트 할 필요가 없습니다이

if t<50: 
    t+=1 
    return iteratepal(b+n) 
+0

Phew, 그 @Martijn Pieters는 * 빠르다 *! –

+0

그가 왜 [이달 초 ... :])인지 이유가 있습니다. – Ben

+0

당신은 * 당신을 반환하지 않았습니다. 당신의 대답에 감사드립니다. –

관련 문제