JavaScript 인터뷰 코딩 질문 - 3

소프트웨어 개발자 인터뷰에서 가능한 코딩 질문 몇 가지를 설명하려고 합니다. 이 세 번째 기사에서 재귀와 배열 돌연변이에 대해 언급하겠습니다. 이 두 가지 주제는 함수형 프로그래밍 패러다임에서 중요합니다. 또한 마지막 예제는 JavaScript에서 상속을 이해하는 데 중요한 프로토타입 상속에 대한 것입니다.

  • 1에서 n 사이의 숫자의 총합을 계산하는 재귀 함수를 작성하시겠습니까?n는 함수의 매개변수가 됩니다. 따라서 종점인 1에 도달할 때까지 이 계산기 함수를 호출해야 합니다. 따라서 가능한 효과적인 솔루션 중 하나는 코드 아래에 있습니다.

    function calculateTotal(number, total = 1) {
      return number > 1 ?
        calculateTotal(number - 1, total + number) :
        total;
    }
    
    console.log(calculateTotal(10));
    

    아래에서 코드를 검사할 수 있습니다.





  • 재귀 계승 계산기 함수를 작성하세요.

    아래와 같이 계승 계산에 동일한 논리를 쉽게 적용할 수 있습니다.


    function factorial(number, product = 1) {
      return number > 0 ?
        factorial(number - 1, product * number) :
        product;
    }
    
    console.log(factorial(5));
    

    !! 위의 재귀 함수는 큰 입력에 대해 스택 오버플로 오류를 일으킵니다. 이를 방지하기 위해 아래와 같이 Trampoline Pattern을 사용할 수 있습니다.


    // recursive optimization to prevent stack overflow error
    function trampoline(fn) {
      return (...args) => {
        let result = fn(...args);
        while (typeof result === 'function') {
          result = result();
        }
        return result;
      };
    }
    
    // Write a recursive function to calculate the total of numbers between 1 to n?
    function calculateTotal(number, total = 1) {
      return number > 1 ?
        () => calculateTotal(number - 1, total + number) :
        total;
    }
    
    const totalCalculator = trampoline(calculateTotal);
    console.log(totalCalculator(100000));
    
    // Write a recursive factorial calculator function
    function factorial(number, product = 1) {
      return number > 0 ?
        () => factorial(number - 1, product * number) :
        product;
    }
    
    const factorialCalculator = trampoline(factorial);
    console.log(factorialCalculator(100));
    

    아래에서 코드를 검토할 수 있습니다.


    <사업부 클래스="ltag__replit">
    <iframe frameborder="0"height="550px"src="https://repl.it/@hco/Recursion?lite=true"loading="게으른"/>



  • 이것은 자바스크립트 배열의 뮤테이터 메소드에 관한 것입니다. 변수의 불변성은 함수형 프로그래밍에서 중요한 주제입니다.


    var arr = [1, 2, 3, 7, 4];
    // Which of the followings will mutate variables?
    // Find a functional alternative for mutator ones.
    arr.push(5);          => mutator
    arr.shift();          => mutator
    arr.concat(6, 7);     => non-mutator
    arr.map(a => a * a);  => non-mutator
    arr.sort();           => mutator
    

    그리고 이것들은 돌연변이 유발자를 위한 대체 솔루션이 될 수 있습니다.


    var arr = [1, 2, 3, 7, 4];
    // Which of the followings will mutate variables?
    // Find a functional alternative for mutator ones.
    arr.push(5);          => arr.concat(5);
    arr.shift();          => arr.slice(1);
    arr.concat(6, 7);     => non-mutator
    arr.map(a => a * a);  => non-mutator
    arr.sort();           => arr.concat().sort()
    

    아래에서 코드를 검토할 수 있습니다.


    <사업부 클래스="ltag__replit">
    <iframe frameborder="0"height="550px"src="https://repl.it/@hco/Functional-Programming?lite=true"로딩="게으른"/>



  • 이것은 프로토타입 상속에 대한 당신의 이해를 점검하기 위한 것입니다.


    function Person() {}
    
    // 1st definition for 'sayHi' method
    Person.prototype.sayHi = function () {
      console.log('Hi!');
    };
    
    var person = new Person();
    
    // What will be the printed message?
    person.sayHi();
    
    // 2nd definition for 'sayHi' method
    Person.prototype.sayHi = function () {
      console.log('Hello!');
    };
    
    // What will be the printed message?
    person.sayHi();
    
    // What will be returned?
    person.hasOwnProperty('sayHi');
    

    출력은 다음과 같습니다.


    Hi!
    Hello!
    false
    

    person 함수에 메서드가 없기 때문에 개체에 고유한 sayHi() 메서드가 없습니다. Person 키워드로 개체를 인스턴스화하면 함수의 모든 new 메서드를 prototype 속성으로 상속합니다. 따라서 __proto__의 첫 번째 실행에서 정의된 것이 로깅sayHi()이므로 실행됩니다. 그러나 Hi!의 두 번째 정의 후에 더 새로운 것이 호출됩니다. sayHi()는 프로토타입 상속으로 인해 동일한 기능을 가리키기 때문입니다. 마지막으로 person.sayHi()person.hasOwnProperty('sayHi')를 반환합니다. 이것은 false 객체의 속성이 아니기 때문에 프로토타입 체인에 의해 상속됩니다.



    아래에서 코드를 검토할 수 있습니다.


    <사업부 클래스="ltag__replit">
    <iframe frameborder="0"height="550px"src="https://repl.it/@hco/Prototypal-Inheritance?lite=true"로딩="게으른"/>




  • 나의 다른 기사:


    <사업부 클래스="ltag__link">





    <사업부 클래스="ltag__link">





    <사업부 클래스="ltag__link">


    좋은 웹페이지 즐겨찾기