• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

피보나치수열 구현 못하면 문제가 있는거겠죠??

21.07.16 19:28 작성 조회수 528

1

사실 제귀함수 자체를 이해하기까지도
어려웠습니다..
그래도 이해하고 피보나치 수열을  구현하려 생각을 해봐도
x + y = z 에서 y와 z값을 앞으로 밀면 될꺼같은데
이 부분에서 막혔습니다..


코드 3개정도를 생각하고 해봤지만 다른값이 나오고
결국 다른사람의 코드를 봤습니다..

그럼에도 완벽하게 이해는 못했지만
작동원리는 알겠습니다..
n-1 + n-2 = n
막상 보고나니 머리가 멍해집니다..
제가 더 생각해본다고 답이 나왔을꺼란 생각은 안들기도 하고..

지금 제 수준 문제가 많은거겠죠??

남들보다 안좋은 머리로 생각한다고 하는데
결국 0+0= 0인가 봅니다..
그래도 계속 하고싶습니다..

그래서 공부 방법에 대해 질문이 있습니다
지금같이 생각을 계속 해봐도 도저히 안될떄
남의 코드를 보고 작동원리를 이해하는건 괜찮을까요??

물론 계속 써봐야지 실력이 느는건 알겠는데
저처럼 머리가 나쁜 상태로 생각을 한다고
 도저히 답에 근접할지가 의문입니다..

그럼에도 생각을 해야 한다는건 동의하는데
그 생각하는거에 시간을 정해두고 그 시간안에
못푼다고 할떄 다른 이에 코드를 보고 공부하다보면
기초적인 부분이 지나고 지식이 쌓이다보면
자연스럽게 모르는 부분이 나왔을떄
답이 나올떄까지 생각을 하는것도
가능하지 않을까 싶어서요.. 

안좋은 공부법일까요??

답변 1

답변을 작성해보세요.

3

안소님의 프로필

안소

2021.07.16

너무 자책하지 마세요! 재귀적인 개념 자체가 원래 어려운 것이 맞습니다. 처음 접하면 이해가 어려운 것이 당연해요!

재귀 함수를 사용하는 코드를 수 없이 많이 짜 본 저조차도 아직도 어렵고 헷갈립니다..ㅋㅋㅋ

이해를 위한 공부 팁을 좀 드리자면..

1. 그림으로 이해하세요. 

피보나치의 부분 문제 중복 사례

(출처 : https://shoark7.github.io)

2차원 배열같은거 글이나 코드보단 그림으로 이해하는 것이 훨씬 쉽다는거 질문자님께서도 공감되실거에요.

재귀도 마찬가집니다. 재귀 함수가 어떻게 돌아가는지도 그림을 참고해보면 이해하기 더 수월해요. 그림을 직접 그려보시는 것도 도움이 되구요. 

위 그림은 피보나치 수열의 함수 호출 방식을 구조적으로 나타낸 것입니다. 

피보나치 점화식 보면 아시겠지만 7번째 피보나치 수열을 구하려면 6번째 피보나치 수열과 5번째 피보나치 수열을 알아야 한다는 전제가 따릅니다.

즉, 7번째 피보나치 수열을 구하는 함수 fib(7) 을 호출하면 그 안에서 fib(6) + fib(5) 이렇게 두 번의 함수를 또 호출해야 한다는 얘기가 됩니다. 이게 재귀함수 방식이에요! 재귀함수는 똑같은 동일한 함수를 내부에서 또 호출하고 또 호출하고 이런거라고 생각하시면 돼요!

2. 알고리즘 공부를 병행해보세요

재귀적인 개념은 알고리즘과 관련이 매우 깊습니다.

DFS, 백트래킹, union-find, 트리 등등 이런 자료구조/알고리즘들은 모두 재귀함수를 사용해서 구현합니다.

알고리즘 책 그림도 잘 되어 있고 설명 정말 친절해요. 알고리즘 책에서 재귀 개념을 사용하는 여러 알고리즘 설명도 읽어보시면서 재귀 개념을 익혀보시기를 권장합니다. 

3. 디버깅을 무조건 하세요.

재귀 함수를 이해하는데 디버깅만한게 없다고 생각합니다.

피보나치 재귀함수 코드 작성해보시고 한줄 한줄 디버깅해보세요. 호출 스택 참고하시면서요!!

디버깅 너무 중요합니다. ㅠㅠㅠㅠㅠ 어차피 개발 하시게 되면 디버깅은 무조건 필수이니 미리 배워두시고 재귀함수 코드 디버깅 돌려보세요. 

말씀하신 것처럼 남의 코드 많이 보는것도 도움 많이 됩니다.

절대 자책하지마세요!!!!! 어려운게 당연한거에요. 화이팅~!

(혹시 피보나치 수열인 An-1 + An-2 = An 이 점화식이 이해가 안되시는거라면... 이건 이해가 필요하다기보단 그냥 이런 식의 규칙을 가진 수열을 피보나치 수열로 부르자~라는 것 뿐입니다. 이해가 필요한 부분은 아니에요..! 피보나치 수열은 이렇게 생겻구나 하는 암기에 가깝습니다.)

최지로님의 프로필

최지로

질문자

2021.07.16

정말 감사합니다 ㅠ
혹시 지금 제가하는 공부법은  c++를 이해하기 위해선 별로일까요??

어떤분들은 머리속의 생각을 코드화하는걸
자연스럽게 하기 위해선 
답이 나올떄까지 생각하는걸 많이 해야한다곤 하는데
지금 상태로 답이 나올떄까지 몇시간 몆 일 이고 생각하는게
더 좋은 방법일까요??

안소님의 프로필

안소

2021.07.16

정답은 없어요. 적당히 고민하고 생각해보고 해결 안되면 답 찾아서 공부해보고 하는거죠 :) 

디버깅 필수로 해보세요 꼭!