오늘은 재귀(recursive)와 알아보기 쉽게 코드를 작성하는 방법에 대해 배웠다.
재귀라고 하면 함수를 스스로 호출하는것!! 이것을 통해 반복문을 편하게 재귀로도 사용 할 수 있을 것 같다.
문제 접근 방법 문제를 풀기 전 분석을 하면서 psudocode작성을 통해 문제를 어떻게 구현해 나갈지 생각을 정리해 나가는 것이다. 앞으로는 풀기전에 psudocode를 작성하고 문제를 해결해야겠다.
현업으로 나가면 여럿이서 하나의 프로젝트를 하고 병합하는 과정에서 서로의 코드를 읽고 수정하는 상황이 빈번하게 발생하기 때문에 코딩을 알아보기 쉽게 하는 법을 배웠다.
평소 안 좋은 습관들이 있다는 것을 알았고 앞으로 코딩해 나가면서 숙지하고 최대한 지키도록 해야겠다.
먼저 재귀란? 함수를 스스로 호출 하는 것이다. 이렇게 말로서는 정확히 이해하기 힘들기 때문에 재귀를 사용한 코드를 몇가지 예시로 들어 보겠다.
//재귀를 이용
function factorial(n) {
if( n === 0) {
return 1;
}
return n *factorial( n -1) ;
}
//반복문을 이용
fuction factorial(n) {
let result = 1;
for (let i =n; i > 0; i--) {
result = result *i;
}
return result;
}
위는 재귀함수의 예시인 팩토리얼 코드이다.
여기서 중요한 개념 하나를 더 알수 있는데 재귀함수는 기본적으로 반복문이지만 반드시!!! 탈출 할 수 있도록 조건을 걸어주는것을 알 수 있다. 이는 무한 반복을 막기 위해서다.
//재귀 함수를 이용
function fibonacci(n) {
if (n === 0) { // 반복 탈출 조건
return 0;
} else if (n === 1) {
return 1;
}
return fibonacci(n - 2) + fibonacci(n - 1);
};
// 반복문을 이용
function getFibonacci(num) {
let i = 0;
let value1 = 0;
let value2 = 1;
let result = [];
while (i < num) {
let newValue = value1 + value2;
result.push(newValue);
value1 = value2;
value2 = newValue;
i++;
}
}
장점은 프로그램의 가독성이 좋다는것 반복문과 비교해서 봐도 한눈에 들어오는것을 알수있다.
단점은 값이 리턴되기 전까지 호출마다 call stack을 새로 생성하기 때문에 메모리 사용이 크다는것이 단점이다.
알고리즘의 해결 방법은 문제 시작 전 문제를 단계별로 분해하고 그 단계를 코드로 어떻게 구현할지 쓰는 것이다.
예시를 들면 이 문제에서는
이 과정으로 psudocode를 작성 할 수 있다.
function replaceFoo(text) {
// foo라는 글자의 index가 -1이 아니면 단어를 찾은 것이다
while( text.indexOf('foo') !== -1 ) { // index를 발견하면
let index = text.indexOf('foo');
// index를 이용해 foo 바로 앞까지의 텍스트를 얻어내고
let beforeText = text.slice(0, index);
// foo 대신 새로운 단어를 넣는다
let replaceText = 'BAR';
// foo 이후의 텍스트를 넣는다
let afterText = text.slice(index + 3); // 'foo'는 세 글자이므로 3을 더함
text = beforeText + replaceText + afterText;
}
return text; // 바뀐 내용을 리턴한다
}
의사소통코드를 작성하면서 느낀점은 미리 코드르 어떻게 짤지 구상하고 접근을 하면 코드 작성 중간에 방향성을 잊어버리는 일이 거의 없음을 느꼈다.
평소에 내가 지키지 않고 넘어갔던 부분에 대해서만 일부 가져와봤다. 앞으로 기본이 될 수 있는 규칙들을 지키면서 코딩 할 예정이다.