2017-05-19 5 views
1

행복 번호를 찾는 프로그램을 작성하려고합니다. more info here. 이것은 학교 과제가 아니지만 필자는 Python 2.7을 연습하려고하고 있습니다. 기본적으로 모든 자릿수를 제곱 할 필요가 있기 때문에 재귀가 중요한 부분입니다. 내 코드에서 필자는 재귀를 사용하여 실행을 계속하고 기본 사례를 가지고 있지만 작동하지만 어떤 이유로 함수를 호출하더라도 재귀가 발생하지 않습니다. 버그 테스트 인 첫 번째 숫자의 자릿수를 반환하고 None을 반환하면 실행이 중지됩니다. 무엇이 문제입니까?파이썬 : 재귀 반환 값 없음

num = raw_input('Pick a positive integer that you want to check for a happy number') 
def happyn(number,second,third,fourth): 
    if len(number) == 2: 
    go = int(number[0])**2 + int(number[1])**2 
    elif len(number) == 3: 
    go = int(number[0])**2 + int(number[1])**2 + int(number[2])**2 
    elif len(number) == 4: 
    go = int(number[0])**2 + int(number[1])**2 + int(number[2])**2 + int(number[2]**2) 

    if len(number) == 1 and int(number) == 1 or int(number) == 7: 
    return True 
    elif len(number) == 1: 
    return False 
    else: 
    print go 
    go = str(go) 
    go1 = go[0] 
    print go1 
    if len(go) == 1: 
     go1 = go[0] 
     happyn(go1,0,0,0) 
    elif len(go) == 2: 
     go1 = go[0] 
     go2 = go[1] 
     happyn(go1,go2,0,0) 
    elif len(go) == 3: 
     go1 = go[0] 
     go2 = go[1] 
     go3 = go[2] 
     happyn(go1,go2,go3,0) 
    elif len(go) == 4: 
     go1 = go[0] 
     go2 = go[1] 
     go3 = go[2] 
     go4 = go[4] 
     happyn(go1,go2,go3,go4) 


print happyn(num,0,0,0) 
+0

'= INT (번호 [0]) ** 2 + INT (번호 [1]) ** 2 + INT (번호 [2]) ** 2 + INT (번호 [2 가지 ] ** 2)'는 버그처럼 보입니다. 이 모든 경우를 대체하기 위해'go = sum (int (x) ** 2 for x) '를 사용하라. –

답변

4

모든 가능한 실행 분기 반환 무엇인가, 그렇지 않으면 재귀가 작동하지 않습니다해야합니다. 예를 들어,이 잘못된 것입니다 : 아무것도 명시 적으로 반환하지 않으면

happyn(go1,0,0,0) 

이 함수는 None를 반환합니다. 따라서 올바른 방법은 다음과 같습니다.

return happyn(go1,0,0,0) 

함수의 다른 모든 종료 점에 대해서도 동일합니다.

0
  1. 재귀 호출의 결과를 반환하지 않습니다 (예 : return happyn(go1, 0, 0, 0)). 파이썬에서 return 문없이 끝나는 함수는 암시 적으로 None을 반환합니다.

  2. 이것은 실제로 재귀를 사용하기에 좋은 장소는 아닙니다. 간단한 while 루프가 더 적합 할 것입니다.

    def sum_sq(i): 
        total = 0 
        while i: 
         total += (i % 10) ** 2 
         i //= 10 
        return total 
    
    def is_happy(i): 
        while i >= 10: 
         i = sum_sq(i) 
        return i in (1, 7) 
    
    def main(): 
        i = int(raw_input("Please enter a positive integer: ")) 
        if is_happy(i): 
         print("{} is a happy number.".format(i)) 
        else: 
         print("{} is an unhappy number.".format(i)) 
    
    if __name__=="__main__": 
        main()