안뇽하세요 시험기간일수록 과제가 늘어나기 때문에 공부할 양이 많아집니다 ㅎㅎ
오늘의 TIL도 렛츠기릿
오늘은 전공과목 <문제해결기법> 수업이 있었고, week7 강의주제인 recursive function과 recursion diagram을 학습했다. 사실 재귀함수는 1학기 전공과목 <프로그래밍기초>를 통해 배운 경험이 있지만, 다른 점은 struct 개념과 연관시킬 수 있고, diagram 그리는 것은 처음이기 때문이다. 오늘 배운 개념 중 중요하다고 생각되는 부분을 요약해서 다시금 정리해보자.
재귀함수의 필수 두가지: 종료조건과 함수의 구현형태(반복형태)
재귀함수를 선언할 때, 가장 오류를 줄이고 쉽게 선언할 수 있는 절차는 재귀함수의 필수 두가지를 고려하여 코드를 작성하는 것이다. 바로 종료조건과 함수의 구현형태. 재귀함수의 경우, 연산이 종료되는 시점이 반드시 발생하고, 이때의 종료 조건을 파악하여 예외적으로 처리하는 것이 keypoint이다. 나머지 구현형태(반복형태)는 종료조건 이외의 모든 경우에서 사용되는 코드다.
주로 반환값이 자기 자신(함수)에 새로운 input을 입력하거나 수를 연산하는 형태인 것 같다.
이건 좀 한정적인 개념이지만..(부제: 피보나치)
오늘 강의시간에 본 재귀함수의 예시는 팩토리얼과 피보나치 수열이었는데, 두 가지 모두 대표적으로 잘 알려진 케이스들이라 따로 부가설명이 없이 코드풀이가 진행되었다. 팩토리얼은 그 자체가 누적된 수들의 곱이기 때문에 문제를 이해하는 데 오류가 없었지만, 피보나치 수열의 경우, int n 이 입력될 때, 수열의 n번째 수까지의 총합을 구하는 것이라 잘못 이해했다. 그런데 n번째의 숫자를 구하는 것이라는 것! (ex. n=0, return 0 / n=1, return 1 / n=2, return 1 / n=3, return 2 ...) 좀 세부적인 사항이지만 대표적인 케이스들이니 기억해 두면 좋을 것 같다! ㅎㅎ
iterative function
쉽게 생각해 for loop을 사용하는, 반복문 형태의 함수라고 볼 수 있다. 물론 재귀함수 자체가 더 컴팩트한 코드이기 때문에, 필요에 따라 선택하여 사용할 수 있겠다. 더 자세한 부분은 2학년 전공과목 중 <자료구조>에서 배울 수 있을 것 같다.
.
.
.
그리고 오늘의 TIL로 남기고 싶었던 Assignment#6에 대한 기록 시작!
먼저 assignment6의 소문제 Q1. 주어진 재귀함수에 대한 diagram을 작성하는 것이었기에, 코드에 대한 이해로 충분히 접근할 수 있는 문제였다.
강의시간에 배운 팩토리얼의 recursive diagram에서 * 기호 대신 + 기호로 바뀐 듯한 개념! 가볍게 풀었다.
다음으로 주어진 Q2,Q3에 대한 example program. 역시나 재귀함수다. 그런데 재귀함수를 따라가다보면, lo <= hi, 즉 정상적인 배열이 입력되고 배열(list)안에 찾고자 하는 숫자(key)가 있는 모든 경우에서 모두 0을 반환값으로 가진다는 것이다. 그런데 Q3가 이 코드에 대한 해석 및 이용경로 서술이었기에 뭔가 허전하다는 생각이 들었다. 정말 단순히 숫자가 배열에 있는지 없는지, 그 유무만 확인하는 용도라고? 싶은 마음에 TA 분들께 메일을 썼고, 교수님의 빠른 피드백과 함께 문제를 다시 받게 되었다.
다시 업로드된 코드는 내가 제기한 문제처럼 list[mid]==key 조건일 때 반환값이 mid가 되도록 수정되었다.
코드 공부도 할 겸 주어진 함수 부분을 그대로 들고 와 실행할 수 있는 코드로 작성했다. 내가 짠 코드는 입력받을 배열의 인덱스 수, 배열, 찾고자 하는 수를 입력받고, bs function의 반환값에 따라 숫자가 있는지 없는지, 있다면 몇 번째 인덱스에 있는지 알려주는 코드였다. 이러한 코드를 바탕으로 dataset을 테스트하고 함수의 기능을 상세히 서술했다.
보다 자세한 서술을 작성한 레포트를 함께 첨부한다.
.
.
.
사실 이번 문제해결은, 나의 또 다른 변화를 잘 보여준다.
1) 의문이 생겼을 때, 틀릴지라도 물어보고 확인하기
2) 코드에 대한 이해를 위해, 강요되지 않은 코드 작성 스스로해보기
1과 2는 부끄럽지만, 이전까지 내가 해오던 행동들이 아니다. 오히려 반대라면 반대일 수 있는. 그런데 이번 문제해결 과정에서 나는 1)과 2)를 자연스럽게 행동했고, 그 결과 과제에 대한 코드를 보다 잘 이해하고 있으며 빠르게 완성할 수 있었다. 오늘의 감정과 배움을 잊지 말자!!
'studylog' 카테고리의 다른 글
231020 TIL (0) | 2023.10.20 |
---|---|
231018 TIL (1) | 2023.10.18 |
231015~16 TIL (2) | 2023.10.16 |
231013 TIL (2) | 2023.10.13 |
~231012 TIL (0) | 2023.10.12 |