재귀

2567 단어 typescriptjavascript
대부분의 경우 사람들은 재귀 함수로 작업하는 데 어려움을 겪습니다. 여기 트릭이 있습니다 -

재귀 함수에는 항상 최소한 2가지가 있어야 합니다.
  • 기능이 종료되는 조건입니다.
  • 함수가 자신을 호출하는 재귀.

  • 몇 가지 예를 살펴보겠습니다.
  • 재귀를 사용하여 문자열을 반전시켜 봅시다.

  • function reverseString(str){
      if (str === '') return '';
      return reverseString(str.substr(1)) + str[0];
    }
    

  • if (str === '') return ''; 이것은 함수가 종료/종료되는 조건입니다. 문자열이 비어 있으면 함수가 중지됩니다.
  • return reverseString(str.substr(1)) + str[0]; 이것은 문자열을 수정하고 업데이트된 문자열로 다시 함수를 호출하는 재귀 로직입니다. string'dev'에 대한 위 함수의 실행을 보자.
  • reverseString('dev'); 이것은 다음 단계에서 실행됩니다 -
  • reverseString('ev') + 'd';
  • reverseString('v') + 'e';
  • reverseString('') + 'v';
  • if (str === '') return ''

  • 최종 출력은 'ved'입니다.

    때때로 사람들은 재귀를 사용해야 할 때와 루프를 사용해야 할 때를 혼동합니다. 위의 예에서는 루프를 사용할 수도 있습니다. 물론 간단한 자바스크립트str.reverse() 메서드를 사용할 수도 있습니다.

    그러나 재귀가 더 나은 선택인 또 다른 예를 살펴보겠습니다.

    복잡한 중첩 개체가 있고 이 개체를 동적으로 생성하고 개체의 복잡성을 미리 알지 못한다고 가정합니다. 예를 들어 -

    const data = {
      'person' : {
         'name' : {
           'fname' : 'Dwight',
           'lname' : 'Schrute'
         },
         'age' : 38
      }
    }
    

    이제 'person.name.fname' 값을 가져와야 합니다. 여기서 키의 경로는 문자열이며 키가 얼마나 중첩되는지 알 수 없습니다. 값을 반환하는 함수를 만들어 보겠습니다.

    function findValue(obj, path) {
        const keysArr = path.split('.');
        if (keysArr.length === 1) {
          return obj[parts[0]];
        }
        return findValue(obj[keysArr[0]], keysArr.slice(1).join('.'));
      }
    
    findValue(data, 'person.name.fname'); 이것은 다음 단계에서 실행됩니다 -

    1. const keysArr = path.split('.'); // ['person', 'name', 'fname']
    2. findValue(obj['person'], 'name.fname');
    3. const keysArr = path.split('.'); // ['name', 'fname']
    4. findValue(obj['name'], 'fname');
    5. const keysArr = path.split('.'); // ['fname']
    6. if (keysArr.length === 1) {
          return obj[parts[0]];
        }  // return obj[fname]
    

    최종 출력은 'Dwight'입니다.

    질문이나 제안 사항이 있으면 알려주세요. 읽어 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기