2017-04-06 2 views
-2

재귀 및 스택 작동 방법을 배우고 있습니다. 이 함수에서 스택 추적을 이해하는 데 문제가 있으며 내 console.log 문이 무엇을하는지 설명하는 데 문제가 있습니다.재귀 함수 스택 추적 이해

function expoRecursion(base, exp) { 
    debugger; 
    if(exp == 1) { 
    console.log('the exp value is ' + exp + ' , base is returned'); 
    return base; 
    } else { 
    console.log('line 278 the function evaluates ' + expoRecursion(base, exp -1)); 
    return base * expoRecursion(base, exp-1); 
    } 
} 
expoRecursion(2,3); 

내가 크롬 개발 도구에서 이것을 실행하고 그것을 통해 강화하지만, 기본 케이스 후 경험치가 1 때 반환되는 이유의 본질을 얻을 수없는 것, 우리는 (2, 2 expoRecursion 팝 -1), expoRecursion (2, 3-1)로 이동 한 다음, 이미 평가 된 경우 expoRecursion (2, 2-1) 스택에 다시 추가 하시겠습니까?

the exp value is 1 , base is returned 
line 278 the function evaluates 2 
the exp value is 1 , base is returned 
line 278 the function evaluates 4 
the exp value is 1 , base is returned 
line 278 the function evaluates 2 
the exp value is 1 , base is returned 

왜 마지막 문장 2는 다음 최종 반환 값이 8로 다시 온다 : 그런 혼란은 읽어 내 로그 문에서 오는 것 같다?

+1

결과'console.log (..... expoRecursion (base, exp -1));을 기록하기 위해'expoRecursion' 함수를 호출하여 새로운 재귀를 생성합니다. – Titus

+1

로그 문과 return 문 모두 재귀를 호출합니다. 아마 당신이 원하는 것이 아닙니다. – pvg

+0

젠장, 내가 console.log 문에서 함수를 agin 함수를 호출하고 있다는 것을 깨닫지 못했다. –

답변

1

다른 사람은 이미 혼란의 기초를 지적 : 당신이 당신의 다른 절에 두 번재발. 한 번만 재발 결과를 저장하고, 두 곳 모두에서 그사용 :이 당신을 위해 그것을 청소 생각

} else { recur_result = expoRecursion(base, exp -1); console.log('line 278 the function evaluates ' + recur_result); return base * recur_result; } 

가 당신의 기대와 일치하는지 여부를 참조하십시오.

+0

알다시피, 나는 내 실수와 내 혼란을 보았다. –