프로그래밍

재귀함수 질문드립니다

화면 캡처 2021-04-14 005741.png

 

def solution(numbers, target):
    if numbers == []:
        if target == 0:
            print('target=0')
            return 1
        else:
            print('target : ', target)
            return 0
    else:
        if target >= 3:
            print('left : ', target)
        else:
            print('right : ', target)
        print("numbers=" , numbers)
        return solution(numbers[1:], target+numbers[0]) + solution(numbers[1:], target-numbers[0])

 

 

선배개붕님들

 

이 문제 해설 보다가 재귀함수로 푼 예제를 봤습니다.

 

저기 빨간 글씨 부분이 이해가 어렵습니다..

 

직접 print문 작성해서 변수를 일일이 출력해보아도 전혀 작동방식을 모르겠습니다.

 

왼쪽 함수 다 돌고 마지막부분에서 다시 오른쪽 함수가 돌아가는 것이 맞는지..

 

저렇게 return에 재귀가 2개 + 되있는게 어떻게 돌아가는지 설명 부탁드립니다!!

13개의 댓글

23 일 전

숫자를 미리 더하던가 뺀다고 생각을 하면 될듯

그렇게 하면 마지막에 원하는 숫자가 되면 1을 리턴하면 되고 아님 0을 리턴을 해서 그걸 계속 가지고 올라오면서 리턴값을 전부 더해주는거지

0
23 일 전
@나린제아

하.. 이해가 어렵네요..

리턴에 함수+함수 이렇게 있는데

왼쪽 함수부터 쭉 들어가서 마지막 부분에서

다시 오른쪽 함수 쭉 들어가서

 

왼쪽 마지막 + 오른쪽 마지막

왼쪽 마지막 + 오른쪽 마지막 -1

...

왼쪽 마지막 + 오른쪽 처음

왼쪽 마지막-1 + 오른쪽 마지막

...

왼쪽 처음 + 오른쪽 마지막

왼쪽 처음 + 오른쪽 마지막-1

...

왼쪽 처음 + 오른쪽 처음

 

이런 식으로 진행이 되는걸까요???

0
23 일 전
@Hime

이게 맞네요! 그런데 왼쪽 단계별 오른쪽 마지막~처음에서 타겟값 또한

왼쪽 값에 따라 바뀌는 것을 생각을 못 했었네요. 감사합니다.

그런데 혹시 타겟이 0이냐 아니냐에 따라 리턴값이 1,0인데 해석이 가능하시나요??

0
22 일 전
@Hime

처음에 타겟으로 시작해서 리스트의 첫 숫자를 빼거나 더해서 넘기잖아여

그럼 마지막에 0이 되면 숫자를 만든게 되고 아님 숫자를 못만든거져

그러니깐 0이면 리턴값이 1이고 아님 0이지여

0
21 일 전
@나린제아

넘버가 마이너스일수도잇고 쁠러스일수도잇고 해서

그런거엿군요..

기준을 타겟으로 잡아야 타겟이 되는지...

ㄹㅇ 감사합니다

0
23 일 전

가장 마지막 오른쪽 함수부터 리턴 값 받아서 다시 왼쪽으로 한 단계씩 올라가는거라고 생각하면 쉬울듯

0
23 일 전
@새벽의철학자

아 이제 저 코드의 재귀함수가 어떻게 작동하는지는 이해가 됐습니다!!

감사합니다..

그런데 타겟이 0이면 리턴1이고 타겟이 0이 아니면 리턴이0인게

혹시 이유를 아시나요??

0
23 일 전
@Hime

타겟을 적절히 더하거나 뺴서 0을 만들면 타겟값을 만든거니, 만들 수 있는 방법 count+1 해주는거 같은데..

0
21 일 전
@새벽의철학자

와 이제 다 이해가네요 감사합니다!!

0
23 일 전

호출 순서 규약은 언어(혹은 컴파일러)마다 스펙으로 정해놓은게 있으니 그걸 먼저 찾아보시길

0

함수 처음에 print를 찍어서 어떤 순서로 실행되는지 직접 확인해보시오

0
22 일 전

제가 추천하는 방법은요,

종이에 먼저 각각의 numbers 와 target이 숫자가 변할 때마다 sequential 하게 테이블로 정리해보시는게 좋을 듯 합니다.

일단 재귀함수도 실행하게되면 스택에 push 되는 형식으로 쌓이게 되거든요,

결과적으로 맨 마지막에 실행이 되고 return 이 되어 다시 거꾸로 올라가면서 값이 대입되고 다시 또 대입되고를 반복하는데요,

일단 코드를 이해하는 것도 중요하지만,

손으로 하나하나 써보면서 이해하는게 제일 좋은 방법 같습니다~

0
21 일 전
@렙의초심자

감사합니다 ㅠㅠ

다들 도와주신 덕분에 지식이 늘었습니다..

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
149686 [컴퓨터] 그래픽 카드 꺼짐? 허쉬맛있다 0 28 분 전 12
149685 [잡담] 갤럭시 버즈 라이브 약 3주가량 사용후기. 다나까12 0 1 시간 전 51
149684 [잡담] lg 32un650 이틀 사용후기 다나까12 0 1 시간 전 29
149683 [잡담] 너넨 윈도우 정품 절대 사지마라 7 미역사세요 0 3 시간 전 224
149682 [잡담] 윈도10 업데이트가 계속 실패하는데 이거 어떻게 방법 없을까? 2 풍성충 0 6 시간 전 73
149681 [잡담] 컨셉피씨 맞추니까 부품 교체가 힘드네 1 유상의행복은있어요 0 7 시간 전 102
149680 [정보] IBM 2나노 칩 공개 7 디다케 1 7 시간 전 254
149679 [컴퓨터] 무선 헤드셋 지연없이 사용할 수 있어? 10 골댕이 0 8 시간 전 134
149678 [잡담] 애플tv보려면 무조건 애플제품있어야하니 3 사라단 0 9 시간 전 207
149677 [정보] 오늘의 IT뉴스: 갤S21FE 생산 / 갤탭S7라이트 렌더링 유출 / ... 1 골든사랑 0 9 시간 전 264
149676 [컴퓨터] 속보) 황회장 채굴용 그래픽카드 계획없어 1 30무직백수 0 10 시간 전 261
149675 [컴퓨터] 마이크로SD 카드 1테라가 단돈 1만원 이거 실화임? 11 백병원원무과 0 11 시간 전 295
149674 [컴퓨터] ERR_CONNECTION_TIMED_OUT 이거 해결 방법 없나여? 2 70도물구나무서기 0 12 시간 전 66
149673 [잡담] ips패널내에서 122hz, 144hz, 160hz 전부 다 체감안되니 걍 ... 15 krrr 0 12 시간 전 191
149672 [모바일] 노트10 쓰는데 노트21 매우 기대했는데 왜 안 나와 9 CarotenAll 0 12 시간 전 140
149671 [컴퓨터] 써멀패드 0.5빼고 종류별로 다 샀음 1 Tbps 0 12 시간 전 105
149670 [컴퓨터] 글카랑 보드랑 손잡고 나란히 죽었다 5 유상의행복은있어요 0 13 시간 전 89
149669 [컴퓨터] 50만원정도 모니터 추천해줄수있어..? (게임용! ips러버! 160... 7 댕둥댕둥 0 13 시간 전 71
149668 [컴퓨터] 형님들! 게이밍 노트북 사려고 합니다! 4 모옥캔디 0 13 시간 전 70
149667 [견적] 컴알못 완본체 추천 부탁드려요 3 25시 0 13 시간 전 88