[TS] 정당명으로 배우지 않는 귀속 함수

16920 단어 TypeScripttech

개시하다


갑작스럽습니다. 다음 기사를 보셨습니까?
  • 참조: NHK에서 국민당을 보호하는 것부터 NHK를 보호하여 국민당을 보호하는 것까지, NHK에서 국민당을 보호하는 보호당까지
  • 제목과 같이 수학적으로 어떤 정당명을 설명하는 내용은 읽을 만하다.
    ※ 수열이나 점화식 같은 고등학교 수학 지식(없더라도)이 있다면 즐겁게 읽을 수 있으니 추천합니다.
    그중에 Perl에 기재된 다음과 같은 코드가 있다.
    # 引用:https://qiita.com/MirrgieRiana/items/da7dade622770a04d8f7
    sub N {
      my $n = shift;
      return $n == 0 ? "国民"
           : $n == 1 ? "NHK"
           :           N($n - 1)."から".N($n - 2)."を守る党";
    }
    print N(4), "\n";
    
    'NHK로부터 국민을 보호하는 당'이라는 문자열을 기점으로 점화식으로 표현한 경우N(0)=国民N(1)=NHK
  • N(2)=N(1)からN(0)を守る党
  • N(3)=N(2)からN(1)を守る党
  • N(n)=N(n−1)からN(n−2)を守る党
  • 이런 결과가 나왔는데 코드로 표현하면 이런 내용이다.
    이거 보고'이거 컴백 함수 장르로 좋지 않나요?'내 생각엔
    예전에는 회사 신입에게 회귀 함수를 설명하면서'임의의 깊이의 디렉터리를 다시 탐색하는 프로그램'이라고 적어 설명했지만, 내용이 재미가 부족해 인기가 없었다.
    이런 점에서 이 제재는 출력 내용의 화면에서도 재미있기 때문에 회귀함수라는 내용에 초점을 맞추고 싶습니다.
    그나저나 Perl에 익숙하지 않아서 자신 있는Typescript로 기재하기로 했습니다.

    도대체 회귀 함수는 무엇입니까?


    귀속 위키백과에는 다음과 같은 내용이 설명되어 있습니다.
    귀환이란 어떤 사물을 묘사할 때 묘사한 자신에 대한 인용이 그 묘사에 나타나는 것을 말한다.
    따라서 귀속 함수는'함수에서 함수 자체를 호출하는 함수'를 가리킨다.
    "이게 무한 순환이 되지 않나요?"이렇게 생각하는 사람은 매우 예민하다.
    명확한 정의가 있어야 한다고 생각하지만 무한순환에 빠지지 않기 위해 회귀함수는 다음과 같은 조건을 충족시켜야 한다.

    귀속 처리의 끝 절차를 준비했다


    귀속 함수를 사용하여 10부터 0까지 카운트다운을 하면서 컨트롤러에 표시된 프로그램의 예를 고려하십시오.
    const rec = (i: number): void => {
      // iが0未満になったら終了
      if(i < 0) return;
      // iをコンソールに表示
      console.log(i);
      // iをデクリメントして再帰呼び出し
      rec(i-1);
    }
    
    출력 결과는 다음과 같다.
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    0
    
    코드 중의 if(i < 0) return;는 절차를 끝낸다.
    이 지점이 없었다면i은 무한히 감소-1,-2,-3했을 것이다.
    ※ 수치상 비트수 경계가 있어 엄밀히 말하면'무한 체감'rec()은 아니지만, 무한 호출로 끝나지 않습니다.
    따라서 귀속 함수를 고려할 때 반드시'귀속 함수 처리 중지'를 준비해야 한다.
    대략적인 귀속 처리는 수치와 관련이 있다고 생각하기 때문에'계수기 처리의 수치가 일정한 조건에 이르면 끝난다'는 경우가 비교적 많다.
    처음에 말한'디렉터리의 귀속 탐색'에서'중첩 디렉터리가 null로 변할 때'가 끝 조건이다.

    특정 정당 이름의 귀속 함수를 Typescript로 재현하다


    오프닝이 길어진 게 본론입니다.
    원래의 보도를 본뜨다
  • N(0)=国民
  • N(1)=NHK
  • N(2)=N(1)からN(0)を守る党
  • N(n)=N(n−1)からN(n−2)を守る党
  • 함수를 정의합니다.
    const nhk = (n: number): string => {
      // 終了条件①
      if(n===0) return '国民';
      // 終了条件②
      else if(n===1) return 'NHK';
      // 再帰呼び出し
      else return `${nhk(n-1)}から${nhk(n-2)}を守る党`;
    }
    
    console.log(nhk(0));
    // -> 国民
    console.log(nhk(1));
    // -> NHK
    console.log(nhk(2));
    // -> NHKから国民を守る党
    console.log(nhk(3));
    // -> NHKから国民を守る党からNHKを守る党
    
    수치형이라면 무엇이든 보낼 수 있기 때문에 엄밀히 말하면 n < 0도 고려해야 하는데 Typescript로 원코드를 재현하면 이렇게 된다.
    귀속 호출 단계n에서 2를 빼는 두 가지 종료 조건이 있다.
    이렇게 하면 Typescript 어떤 정당의 이름을 다시 처리하는 함수를 만들 수 있다.

    경품'뭘 보호하고 있는지 쉽게 알 수 있게'.


    학습귀속함수로서의 교재는 충분한데 이전nhk이 매개 변수10로 집행되었다면 결과는 다음과 같다.
    console.log(nhk(10));
    

    출력


    NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党を守る党を守る党
    
    이러면 뭘 지키고 있는지 몰라요.
    사람은 보호할 것이 있어야 강해지기 때문에 무엇을 보호해야 하는지 분명히 해야 한다.
    복잡한 구조로 보이지만'A에서 B보호당으로'라는 일본어로 구성은 간단할 것으로 보인다.
    따라서 방금 전의 함수만 약간 수정합니다.

    수정 후


    const nhk = (n: number, isChild?: boolean):string => {
        return  n===0? '国民'
                :n===1? 'NHK'
                :`${
                    (isChild?'':'「') +
                    nhk(n-1,true) +
                    (isChild?'':'」\n')
                }から${
                    (isChild?'':'\n「') +
                    nhk(n-2,true) + 
                    (isChild?'':'」\n')
                }を守る党`
    }
    
    if...else는 세 가지 연산자로 간소화를 대체했는데 요점은 두 번째 파라미터isChild를 추가한 것이다.
    이것은 첫 번째 호출 중undefiend이고 귀속 호출 시true의 값으로 실행 단계 함수 자체에서'현재 귀속 호출이 되고 있는지'를 이해할 수 있다.
    이렇게 하면 최상위 레벨에서 작업할 때 보호해야 할 객체와 보호해야 할 객체 사이에 괄호를 둘 수 있습니다.
    console.log(nhk(10));
    

    수정 후 내보내기


    「NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党を守る党を守る党」
    から
    「NHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党からNHKから国民を守る党からNHKを守る党を守る党からNHKから国民を守る党からNHKを守る党からNHKから国民を守る党を守る党を守る党を守る党」
    を守る党
    
    그렇구나.
    그렇다면 지켜야 할 것이 무엇인지(잘 모르겠다).

    좋은 웹페이지 즐겨찾기