Q1. 함수의 인자로 들어오는 정수가 홀수인지 아닌지 확인하기
- 나머지 연산자를 사용하지 않는다.
- 홀수가 아니라면 다 false 를 리턴한다.
- 홀수는 해당 숫자에 2를 계속 뺐을때 최종적인 값이 1이 되어야 한다.
풀이 단계 1 - 재귀에서 기초가 되는 값을 작성하자
function isOddNumber(num){
// 단계 1. num이 0 일 경우 -> false
if (num === 0){
return false;
}
// 단계 2. 연산의 기초값 -> 최종적으로 num이 1이 된다면 true
if (num === 1){
return true;
}
}
풀이 단계 2 - num이 음수일 때 어떻게 재귀를 돌리고, 최종적으로 재귀는 어떻게 형성시킬까?
function isOddNumber(num) {
// 단계 1. num이 0 일 경우 -> false
if (num === 0) {
return false;
}
// 단계 2. 연산의 기초값 -> 최종적으로 num이 1이 된다면 true
if (num === 1) {
return true;
}
// 단계 3. num < 0 일때.
if (num < 0) {
return isOddNumber(-num) // num을 양수로 변경시켜서 다시 작동시킨다.
}
// 단계 4. 최종적으로 우리는...
// num을 최종적으로 2를 빼가면서 1이 되는지를 봐야지!
return isOddNumber(num - 2)
}
이 문제를 풀면서 재귀로 사고하는 과정을 기르기에 가장 충분한 문제였지 않았나 하고 생각했다. 규칙을 찾고 단순화 시킬 수 있는 패턴이 있는지 보고 적절하게 단순화 시키는 것. 그것이 지금까지 내가 이해한 재귀다.
Q2. 두 정수가 주어질 때, 첫번째 숫자부터 두번째 숫자 전까지 모든 수의 곱 구하기
- ex. 1, 4 > 리턴 1 x 2 x 3
- 두번쩨 수가 첫번째 수보다 작으면 0
- 두 수가 같으면 0
- 두 수의 차이가 1이라면 앞의 숫자 리턴, 음수도 동일하다.
반복적인 규칙이 한 번에 눈에 들어왔다. 앞에서 정의해준 규칙들만 잘 추려주면 쉽게 문제를 해결하지 싶었다.
function multiple (num1, num2) {
// 조건 1. 두 수가 같거나, num2가 num1 보다 작다면?
if (num2 <= num1>) {
return 0
}
// 조건 2. 두 수의 차이가 1이면 앞에서 리턴
if (num2 - num1 === 1) {
return num1
}
// 조건 3. 재귀!
return multiple(num1, num2 - 1) * (num2 - 1)
}