문제
Write a recursive function called someRecursive which accepts an array and a callback. The function returns true if a single value in the array returns true when passed to the callback. Otherwise it returns false.
배열과 콜백을 받는 someRecursive라는 재귀 함수를 작성하십시오. 콜백에 전달할 때 배열의 단일 값이 true를 반환하면 함수는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
// SAMPLE INPUT / OUTPUT
// const isOdd = val => val % 2 !== 0;
// someRecursive([1,2,3,4], isOdd) // true
// someRecursive([4,6,8,9], isOdd) // true
// someRecursive([4,6,8], isOdd) // false
// someRecursive([4,6,8], val => val > 10); // false
문제대로 함수의 형태 만들어보기
배열과 콜백을 받는 someRecursive라는 재귀 함수를 작성하십시오.
function someRecursive(array, callback){}
콜백에 전달할 때 배열의 단일 값이 true를 반환하면 함수는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
function someRecursive(array, callback){
if(callback(array[?])) return true;
return false;
}
재귀의 관점으로 문제를 바라보기
2022.08.15 - [알고리즘] - Recursion 재귀
1. Base Case(종료조건)
종료 조건 추가하기 : 배열이기 때문에 배열의 요소가 존재하지 않을 때 (0일 때) false를 반환
if(arr.length === 0) return false;
2. Different input
'그렇지 않으면 false를 반환합니다.'에서 '그렇지 않으면'의 경우에 재귀를 대입하여 값을 반환한다.
입력 값 중에서 배열의 첫번째 값이 계속 바뀌어야 하니까 배열의 첫번째 요소를 잘라준다.
return someRecursive(array.slice(1), callback);
해결방법
function someRecursive(array, callback) {
if (array.length === 0) return false;
if (callback(array[0])) return true;
return someRecursive(array.slice(1),callback);
}
여기에서 나는 slice 대신 shift를 써주었다. shift는 잘린 '배열'이 아닌 '요소'가 나오는 특성을 이해하지 못하여 문제를 풀지 못했다.
2022.10.30 - [Javascript] - [배열 다루기] shift와 slice의 차이점
이후 그 특성을 안 후 푼 해결방법은 아래와 같다.
내가 푼 방법
function someRecursive(array, callback){
if(array.length === 0) return false;
let arrElement = array.shift();
if(callback(arrElement)) return true;
return someRecursive(array, callback);
}
느낀점
배열 자체를 반환하고 싶을 땐 slice를 사용하고, 배열의 요소를 반환하고 싶을땐 shift를 쓰기
문제를 읽으면서 그대로 함수의 형태를 만들어 보기
'알고리즘' 카테고리의 다른 글
[Elementary Sorting Algotithms] Bubble sort (0) | 2022.11.20 |
---|---|
Searching algorithme (0) | 2022.11.13 |
재귀: recursive range, Fib (0) | 2022.10.02 |
재귀: power 제곱, factorial 계승 (0) | 2022.09.03 |
Recursion 재귀 (0) | 2022.08.15 |