Daehyunii 2022. 8. 4. 23:18

5.1 μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  μš°μ„  μž¬κ·€λΌλŠ”κ²ƒμ΄ λ¬΄μ—‡μΌκΉŒ? λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλ„ κ³΅λΆ€ν–ˆλ“―μ΄ μž¬κ·€λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ μž¬κ·€λ₯Ό μ™œ μ•Œμ•„μ•Ό ν• κΉŒ? μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ”λ° λͺ¨λ“  κ³³μ—μ„œ ν™œμš©λ  수 있기 λ•Œλ¬Έμ΄λ‹€. μš°μ„  μž¬κ·€λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” 'μ‹€ν–‰μ»¨ν…μŠ€νŠΈ μŠ€νƒ'을 이해할 ν•„μš”κ°€ μžˆλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” 이미 λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ³΅λΆ€ν•œμ μ΄ μžˆλ‹€. 

2022.07.20 - [μ–Έμ–΄ 곡뢀 및 정리/μžλ°”μŠ€ν¬λ¦½νŠΈ[λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ]] - 23μž₯ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

 

23μž₯ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μž‘ 원리λ₯Ό λ‹΄κ³  μžˆλŠ” 핡심 κ°œλ…μ΄λ‹€. 이 κ°œλ…μ„ λͺ…ν™•ν•˜κ²Œ μ΄ν•΄ν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ μŠ€μ½”ν”„ 기반으둜 μ‹λ³„μžμ™€ μ‹λ³„μžμ— λ°”μΈλ”©λœ 값을 κ΄€λ¦¬ν•˜λŠ” 방식과 호

pinetree93.tistory.com

  κ°„λ‹¨νžˆ λ‹€μ‹œ 생각해 보자면 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ½”λ“œλ₯Ό 싀행함에 μžˆμ–΄ 일의 처리 μˆœμ„œλ₯Ό κ΄€λ¦¬ν•˜λŠ” 툴이라고 μƒκ°ν•˜λ©΄ 될 것 κ°™λ‹€.

 

  μš°μ„  μž¬κ·€λŠ” 두 κ°€μ§€ 쑰건을 κΌ­ μ§€μΌœμ„œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 첫 번째 쑰건은 λ°˜λ“œμ‹œ μ’…λ£Œ 쑰건이 μžˆμ–΄μ•Ό ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ¬΄ν•œλ£¨ν”„μ— λΉ μ§€κΈ° λ•Œλ¬Έμ΄λ‹€. 두 번째 쑰건은 μž¬κ·€ ν•¨μˆ˜ ν˜ΈμΆœμ‹œ λ§€κ°œλ³€μˆ˜μ˜ λ³€ν™”κ°€ μžˆμ–΄μ•Ό ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λ˜‘κ°™μ€ ν•¨μˆ˜κ°€ λ¬΄ν•œ λ°˜λ³΅λ˜μ–΄ λ¬΄ν•œ 루프에 λΉ μ§€κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλ ‡λ‹€λ©΄ 이제 카운트 λ‹€μš΄μ„ ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ 보자! 

// 반볡문으둜 μž‘μ„±ν•œ 카운트 λ‹€μš΄
function countDown(num){
    for(var i = num; i > 0; i--){
        console.log(i);
    }
}



// μž¬κ·€ν•¨μˆ˜λ‘œ μž‘μ„±ν•œ 카운트 λ‹€μš΄
function countDown(num){
    if(num <= 0) {
        return;
    }
    console.log(num);
    num--;
    countDown(num);
}
countDown(3)

  μ΄λ²ˆμ—λŠ” μž¬κ·€ν•¨μˆ˜λ₯Ό μ„€λͺ…ν• λ•Œ κ°€μž₯ 많이 λ“±μž₯ν•˜λŠ” νŒ©ν† λ¦¬μ–Όμ„ μž‘μ„±ν•΄ 보자. νŒ©ν† λ¦¬μ–Όμ€ 1λΆ€ν„° μ£Όμ–΄μ§„ μ •μˆ˜κΉŒμ§€ λͺ¨λ‘ κ³±ν•˜λŠ”κ²ƒμ„ λ§ν•œλ‹€.

 //for 반볡문으둜 νŒ©ν† λ¦¬μ–Ό κ΅¬ν•˜κΈ°
function factorialll(num){
    let facNum = 1;
    for(let i = num ; i > 0 ; i--){
        facNum *= i;
    }
    return facNum;
}

console.log(factorialll(5));


//while 반볡문으둜 νŒ©ν† λ¦¬μ–Ό κ΅¬ν•˜κΈ°
function fff(num){
    if(num <= 0) return 1

    let res = num;
    while(--num) res *= num;
    return res;
}

console.log(fff(5));


//μž¬κ·€ν•¨μˆ˜λ‘œ νŒ©ν† λ¦¬μ–Ό κ΅¬ν•˜κΈ°
function factorial(n){
    if(n <= 0)return 1;
    return n * factorial(n-1);
}

console.log(factorial(3));

  μœ„μ™€ 같이 μž¬κ·€ν•¨μˆ˜λŠ” λ°˜λ³΅λ¬Έμ„ ν†΅ν•΄μ„œ κ΅¬ν˜„ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ„œ 맀우 κ°„κ²°ν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€. 

 

  μž¬κ·€ ν•¨μˆ˜λ₯Ό μž‘μ„±ν• λ•Œ μ£Όμ˜ν•΄μ•Ό ν•  점을 μ‚΄νŽ΄λ³΄μžλ©΄ μž¬κ·€ν•¨μˆ˜μ—μ„œ μ’…λ£Œ 쑰건이 μ—†κ±°λ‚˜ 잘λͺ»λ˜λŠ” κ²½μš°λŠ” μ•žμ—μ„œ μ„€λͺ…ν–ˆλ“―이 λ¬΄ν•œλ£¨ν”„μ— λΉ μ Έ μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ’…λ£Œμ‘°κ±΄μ„ λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ€˜μ•Ό ν•˜κ³ , λ°˜ν™˜μ„ μžŠκ±°λ‚˜ 잘λͺ»λœ λ°˜ν™˜μ„ 해도 μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆμœΌλ‹ˆ, κΌ­ μ’…λ£Œ 쑰건을 λ§Œλ“€μ–΄ μ€˜μ•Ό ν•œλ‹€!!

 

5.2 헬퍼 λ©”μ„œλ“œ μž¬κ·€

  헬퍼 λ©”μ„œλ“œ μž¬κ·€λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ 쀑첩 ν•¨μˆ˜κ°€ μž¬κ·€ν•¨μˆ˜μΈ 경우, 헬퍼 λ©”μ„œλ“œ μž¬κ·€λΌκ³  λΆ€λ₯Έλ‹€. μ‰½κ²Œ 말해, λ‚΄λΆ€ν•¨μˆ˜ 즉, μ€‘μ²©ν•¨μˆ˜λ₯Ό μž¬κ·€ν•¨μˆ˜λ‘œ λ§Œλ“œλŠ” 것이닀. 예λ₯Ό λ“€μ–΄ μ–΄λŠ λ°°μ—΄μ—μ„œ λͺ¨λ“  ν™€μˆ˜κ°’μ„ μˆ˜μ§‘ν•˜λŠ” 것과 같은 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  μžˆλ‹€λ©΄ 헬퍼 λ©”μ„œλ“œ μž¬κ·€λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μ•„μ£Ό 쒋은 μ „λž΅μ΄μž 접근법이닀. 헬퍼 λ©”μ„œλ“œ μž¬κ·€λŠ” μΌμ’…μ˜ κ²°κ³Όλ₯Ό μ»΄νŒŒμΌν•  λ•Œ ν”νžˆ μ‚¬μš©λ˜λŠ” νŒ¨ν„΄μ΄λ‹€. 보톡 λ°°μ—΄μ—μ„œ 많이 μ‚¬μš©λœλ‹€. ν•˜μ§€λ§Œ, λ°˜λ³΅λ¬Έλ³΄λ‹€ μž¬κ·€λ₯Ό μ‚¬μš©ν•΄μ„œ ν•΄κ²°ν•˜λŠ”κ²ƒμ΄ 쑰금 더 λ³΅μž‘ν•œ 방법일 수 μžˆλ‹€.

function oddValues(array){

    let result = []

    function helper(input){
        if(input.length === 0) {
            return;
        }

        if(input[0] % 2 !== 0){
            result.push(input[0])
        }

        helper(input.slice(1))
    }

    helper(array)

    return result;

}
console.log(oddValues([1,2,3,4,5,6])); // [1,3,5]

5.3 순수 μž¬κ·€

  μœ„μ˜ μ½”λ“œλ₯Ό 순수 μž¬κ·€λ₯Ό ν†΅ν•΄μ„œ μž‘μ„±ν•  μˆ˜λ„ μžˆλ‹€. μ£Όμ˜ν•΄μ•Ό ν•  점은 result배열은 ν•¨μˆ˜κ°€ 호좜 될 λ•Œλ§ˆλ‹€ 빈 배열을 μƒμ„±ν•œλ‹€λŠ” 것을 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

function oddValues(array){
    let result = [];

    if(array.length === 0) {
        return result;
    }

    if(array[0] % 2 !== 0){
        result.push(array[0]);
    }

    result = result.concat(oddValues(array.slice(1)));
    return result;
}

oddValues([1,2,3,4,5]) 

//slice(1)  << λ°°μ—΄μ˜ 1번 인덱슀λ₯Ό μ œμ™Έν•˜κ³  λ‚˜λ¨Έμ§€ 인덱슀λ₯Ό λ³΅μ‚¬ν•΄μ„œ λ°˜ν™˜
//concat() << 인수둜 μ „λ‹¬λœ 값듀을 원본 λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œλ‘œ μΆ”κ°€ν•œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜
//즉, result[1] -> result[3] -> result[5] -> λ°˜ν™˜κ°’[5] -> λ°˜ν™˜κ°’[3,5] -> λ°˜ν™˜κ°’[1,3,5]