마지막 귀속 시 창고 넘침 오류 해결

11274 단어 es6
귀속은 메모리를 많이 소모합니다. 수천 개의 호출 프레임을 동시에 저장해야 하기 때문에 창고 넘침 오류가 발생하기 쉽지만, 꼬리 귀속을 사용하면 하나의 호출 프레임만 존재하기 때문에 창고 넘침 오류가 발생하지 않습니다.
  • 예1: 곱셈 계산
  • function  factorial  (n)  {
    	if  (n  ===  1)  return  1;
    	return  n  *  factorial(n  - 1) ;
    }
    factorial(5)  //  120
    factorial(100)  //  Stack Overflow error
    

    상기 코드는 하나의 곱셈 함수로 꼬리에 값이 있고 함수 꼬리 호출에 속하지 않는다. n차 곱셈을 계산하면 n개의 호출 프레임이 있다. 해결 방법은 다음과 같다.
    function  factorial  (n ,  total)  {
    	if  (n  ===  1)  return  total ;
    	return  factorial(n  - 1, n  *total );
    }
    	factorial(5,  1)  //  120
    

    그러나 이렇게 하면 직관적이지 않은 단점이 있다. 최적화는 다음과 같다.
    function  tailFactorial  (n ,  total)  {
    	if  (n  ===  1)  return  total ;
    	return  tailFactorial(n  - 1 ,  n  *total);
    }
    function  factorial(n)  {
    	return  tailFactorial(n ,  1);
    }
    factorial(5)  //  120
    

    최적화 2: 콜리화
    function  currying(fn,  n)  {
    	return  function  (m)  {
    		return  fn.call(this , m,  n) ;
    	}
    }
    function  tailFactorial  (n ,  total)  {
    	if  (n  ===  1)  return  total ;
    	return  tailFactorial(n  - 1,  n *  total);
    }
    const  factorial  =  currying(tailFactorial,  1) ;
    factorial(5)  //  120
    

    최적화 3:es6 함수 기본값
    function  factorial  (n,  total  =  1) {
    	if  (n  ===  1)  return  total;
    	return  factorial(n  - 1 ,  n  *total) ;
    }
    factorial(5)  //  120
    
  • 예2: 피보나치 수열 n번째 수치를 계산한다
  • function Fibonacci(n) {
    	if ( n <= 1 ) {return  1};
    	return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
    Fibonacci(10) //89
    Fibonacci(100) // 
    

    해결:
    function  Fibonacci2 (n , acl = 1, ac2 = 1) {
    if ( n <= 1) {return  ac2} ;
    return  Fibonacci2 (n  - 1, ac2, acl + ac2);
    }
    

    좋은 웹페이지 즐겨찾기