메뉴로 건너 뛰기 내용으로 건너 뛰기
커뮤니티 COMMUNITY
제목 [Jason Lee] recursion 할 때 stack에서 일어나는 일?
list recursion 27
작성자 Glo*** 등록일 2024-12-21 오후 9:03:33

안녕하십니까, 선생님. recursion을 하고 나면 stack에 쌓인 뒤에 끝나고 하나하나 쌓인것들이 나오는 과정이 이해가 안돼서 질문 올립니다..

선생님께서는 강의에서 항상 "기억한다"라고 표현하셔서 잘 이해가 안돼서 인터넷에 검색해보니 선생님께서도 잠간 언급하셨던  stack이라는 개념이 있더라고요..

그래서 그것을 통해 recursion을 이해하려고 하고 있는데요.. 

첨부한 사진 보시면 선생님께서 안된다고 하신 부분 (this doesn't work)이 있는데요, 그 부분의 stack에서는 어떤 일이 벌어지고 있는지 궁금합니다... 비록 그 다음 부분은 ap 범위 밖의 내용이라고 하셔서 이해안돼도 어찌저찌 넘어가려 했는데.. 영상을 몇 번을 돌려봐도 this doesn't work 부분이 왜 안되는지 이해가 안되더라고요.. 이런 문제는 시험에 나올 수도 있다하셔서.. 확실히 이해를 해야 할 것 같아 글을 남깁니다ㅠㅠ 


저는 this doesn't work에서 pyramid(list);로 recursion을 했을 때

stack에서는 

[1, 2, 3, 4]


[1, 2, 3]

[1, 2, 3, 4]


[1, 2]

[1, 2, 3,]

[1, 2, 3, 4]


[1, 2]

[1, 2, 3]

[1, 2, 3, 4]


[1]

[1, 2]

[1, 2, 3,]

[1, 2, 3, 4] 로 저장될 것이라고 생각했습니다. add를 마친 list를 print 했기 때문에 String으로 stack에 저장될거라고 생각했던거 같은데요.. 그래서 recursion이 끝났을 때 


[1]

[1, 2]

[1, 2, 3,]

[1, 2, 3, 4] 로 나올 줄 알았는데

다 []로 나오는 것을 보고 이해가 안 되더라고요.. 

그래서 실험을 해봤습니다. 뒷 부분에 "before add" 로 list.add(r); 의 하기 전도 print해봤는데

실제로 제가 예측한 결과랑 비슷하게 나오더라고요..

this doesn't work랑 다른 점은 int r 에 저장만 했을 뿐.. list.add(r) 도 하기 전인데.. 도대체 무슨 차이가 있었던 건가요?

첨부파일 질문[7].jpg
2024-12-23 오후 7:42:17

이게 이해가 잘 안되는 부분이긴 해요 ^^

일단, 끝까지 이해하려고 노력하는 부분은 매우 좋은 점입니다. 

리스트는 스트링과는 달리, referencing 구조이기 때문에, 

recursion 을 통해서 수정하는 내용이 실시간으로 반영이 됩니다.

그래서 recursion 이 끝까지 도달(base case까지) 하는 시점에서 리스트 내용이 이미 없어진 상태이지요.

다시 올라오면서 복귀가 되지 않기 때문에, 아무것도 없는 원본이 출력됩니다.

스트링은 반면에 recursion function call 을 할 때 원본과는 무관한 copy 가 전달됩니다.

그래서 나중에 올라오면서 프린트해도, 중간 단계가 다 유지가 됩니다.

다만 리스트는 recursion 단계의 모든 call 에서 실제로 단 하나의 object 만 보고 있다는 게 중요해요.

오히려 리커젼 보다는 object 를 argument 로 pass 할 때 

pass by value 인지, pass by reference 인지를 이해하는게 더 중요합니다. ^^

Top