카테고리 없음

합해서 50이 되는 수들 찾기.

hyuckkim 2020. 5. 22. 06:10
def notas(nums,x):
    n = 0
    newx = []
    for y in nums:
        if x != y: newx.append(y)
    return newx

def add(to, fo):
    global numnow
    for x in fo:
        numnow.append(x)
        if to + x == 50:
            print(str(to) + ',' + str(numnow) + ',' + str(len(numnow)))
        elif to + x < 50:
            add(to + x, notas(fo, x))
        numnow = numnow[:-1]

numbers = [25,27,3,12,19,6,17,24]
numnow = []
    
    
add(0,numbers)

그저께 동생이 학교 문제라면서 가져왔었다. 합해서 50이 되는 숫자들을 고르라는 문제였는데 재귀함수 연습하는데 좋을 것 같아서 골랐다.

코드 완성하기도 전에 25랑 19랑 6이 있다는 걸 발견해서 완성된 건 문제 푸는데 쓰지도 못 했지만 어쨌든 완성했다.

그렇다고 방금 완성한 건 아니다. 그저께 1시간도 안 되서 완성했다.

 

notas 함수는 리스트와 수 하나를 가지고 받은 수를 제외한 리스트를 새로 만드는 함수다. 반복문을 돌릴 때 자기 자신을 계속 더하는 걸 막기 위한 함수다.

add 함수가 이 프로그램의 핵심인 재귀함수다. 현재 수와 리스트를 하나 받아서 리스트로 반복을 돌린다.

반복문의 반복 한 번마다 수 하나를 더해보는 동작이다. 더하면서 '현재 수 목록'에 더한 수를 추가하고 다 더한 수가 50이라면 출력하고 50보다 작으면 함수를 또 써서 또 더하고, 50보다 높으면 아무것도 하지 않은 뒤 이 수로서의 동작을 마친다.

 

그러니까 add 함수 때문에 다른 add 함수가 돌고 있는 동안은 numnow = numnow[:-1]이 사용되지 않으니까 numnow가 차곡차곡 쌓이겠지.

to + x가 50 이상이 되면 add 함수가 더 돌지 않으니까 싸그리 지워질 거고.

 

numnow = numnow[:-1] // 이거 위치를 헷갈려서 시간을 꽤 많이 잡아먹었다. 재귀함수랑 좀 친해져야겠다.