[JS] 재귀함수, 즉시 실행 함수

·2022년 10월 11일
0

JavaScript

목록 보기
11/25

재귀 함수

자신을 호출하는 함수
특정 조건 될 때까지 호출
조건이 충족시 함수 빠져나온다

재귀함수(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));
profile
주니어 프론트엔드 웹 개발자 🐛

0개의 댓글