자신을 호출하는 함수
특정 조건 될 때까지 호출
조건이 충족시 함수 빠져나온다
재귀함수(Top-down, 분할정복) <-> 반복문(Bottom-up)
function factorial(n){
if (n <= 1){ // 종료조건이 없으면 무한반복이 됩니다.
return 1
}
return n * factorial(n - 1)
}
let result = 1;
for (let i = 1; i < 6; i++) {
result *= i
}
console.log(result)
factorial(5)
5! = 5 * 4 * 3 * 2 * 1
n n <= 1 return
factorial(5) 5 false 5 * factorial(4) = 120
factorial(4) 4 false 4 * factorial(3) = 24
factorial(3) 3 false 3 * factorial(2) = 6
factorial(2) 2 false 2 * factorial(1) = 2
factorial(1) 1 true 1
누적합은 아래 코드들이 좋은 코드는 아닙니다.
function 누적합(n){
if (n <= 1){ // 종료조건이 없으면 무한반복이 됩니다.
return 1
}
return n + 누적합(n - 1)
}
누적합(100)
let result = 0;
for (let i = 1; i <= 100; i++) {
result += i
}
console.log(result)
순회를 돌지 않고 해결할 수 있으면 돌지 않고 해결합니다.
let n = 100
console.log(n * (n + 1) / 2)
재귀함수로 문자열을 뒤집는 코드를 작성하세요.
function reverse(txt){
if (txt.length <= 1) {
return txt
}
return reverse(txt.slice(1)) + txt[0]
}
reverse('hello world')
{ a = 2, b = c} 처럼 객체 리터럴에 초기값을 넣어도,
결국엔 객체 리터럴 {} 을 불러와야 함수가 실행이 되는데,
그것마저도 생략해준 것이 { a = 2, b = 2} = {} !!
객체가 매핑이 안됐기때문에 객체구조는 무시되고 그대로 a=2, b=1, c=3만 실행되어 리턴된건가요? 네
단순히 객체-객체 꼴이 아니기때문에 실행이 안됐던건가요? 네
재귀 함수(top-down 위에서 아래, 분할정복) <-> 반복문(Bottom-up 아래에서 위)
내가 나를 호출, 반복문으로 구현 가능
function factorial(n){
if (n <= 1){ // 종료 조건이 없으면 무한반복이 된다
return 1
}
return n * factorial(n - 1)
}
재귀함수로 문자열을 뒤집는 코드를 작성하세요.
function reverse(txt){
if (txt.length <= 1) {
return txt
}
return reverse(txt.slice(1)) + txt[0]
}
reverse('hello world')
참고사항
'hello'.slice(1)
'ello'
n txt.length <= 1 return
reverse('hello') false reverse(txt.slice(1)) + 'h' = 'olleh'
reverse('ello') false reverse(txt.slice(1)) + 'e' = 'olle'
reverse('llo') false reverse(txt.slice(1)) + 'l' = 'oll'
reverse('lo') false reverse(txt.slice(1)) + 'l' = 'ol'
reverse('o') true 'o'
factorial(5)
5! = 5 * 4 * 3 * 2 * 1
n n<=1 return
factorial(5) 5 false 5*factorial(4) = 120
factorial(4) 4 false 4*factorial(3) = 24
factorial(3) 3 false 3*factorial(2) = 6
factorial(2) 2 false 2*factorial(1) = 2
factorial(3) 1 true 1
아래로 갔다가 쭉 올라옴
즉시 실행하고 외부 컨트롤 필요없는 함수
익명 즉시 실행 함수
함수의 이름 없이 소괄호로 function 전체 감싸고
닫는 소활호 옆에 소괄호를 써서 호출
한번 호출하고 사라짐
(function () {
let a = 1;
let b = 2;
return a + b;
}());
기명 즉시 실행 함수
(function foo() {
let a = 3;
let b = 5;
return a * b;
}());
foo(); // ReferenceError: foo is not defined
어차피 실행하지 못해서 의미가 없음.
메모리 효율적으로 관리하기 위해 바로 실행해야 하는 것들을 즉시 실행함수로 관리
function 함수(){
let x1 = 100;
let x2 = 100;
let x3 = 100;
let x4 = 100;
let x5 = 100;
let x6 = 100;
let x7 = 100;
// ...
}
연습문제
중간고사 점수의 평균을 구하는 코드를 함수로 작성해주세요.
let data = [{
반 : 1,
번 : 1,
이름 : "호준",
중간고사점수 : 55
}, {
반 : 1,
번 : 2,
이름 : "길동",
중간고사점수 : 60
}, {
반 : 1,
번 : 3,
이름 : "영희",
중간고사점수 : 30
}, {
반 : 1,
번 : 4,
이름 : "철수",
중간고사점수 : 20
}, {
반 : 1,
번 : 5,
이름 : "규리",
중간고사점수 : 100
}]
답
function 평균값구하기(data){
let sum = 0;
for(student of data){
sum += student["중간고사점수"]
}
return sum / data.length
}
function 평균값구하기(data) {
let 중간고사점수 = data.map((x) => x.중간고사점수)
let 중간고사점수합 = 중간고사점수.reduce((a, b) => a + b)
return 중간고사점수합 / data.length
}
function 평균값구하기(data) {
return data.map((x) => x.중간고사점수).reduce((a, b) => a + b) / data.length
}
console.log(function () {
return data.map((x) => x.중간고사점수).reduce((a, b) => a + b) / data.length
}());
let a = (data) => data.map((x) => x.중간고사점수).reduce((a, b) => a + b) / data.length
console.log(a(data));
let b = (data) => { return data.map((x) => x.중간고사점수).reduce((a, b) => a + b) / data.length }
console.log(b(data));