정보실

웹학교

정보실

javascript JavaScript의 재귀에 대한 빠른 소개

본문

이 함수는 누군가가 중지 할 때까지 자체적으로 호출됩니다.


재귀는 새로운 개발자에게는 어려울 수 있습니다. 아마도 많은 리소스가 알고리즘 예제 (피보나치, 링크 된 목록)를 사용하여 이를 가르치기 때문일 수 있습니다. 이 기사는 간단한 예제를 사용하여 원하는 것을 명확하게 소개합니다.


https://www.freecodecamp.org/news/quick-intro-to-recursion/ 


핵심 아이디어 


재귀(Recursion)는 누군가가 그것을 중지 할 때까지 함수가 자신을 호출하는 것입니다. 아무도 멈추지 않으면 영원히 되풀이됩니다.


재귀 함수를 사용하면 작업 단위를 여러 번 수행 할 수 있습니다. 이것은 for / while 루프를 통해 달성 할 수 있는 것입니다! 그러나 때때로 재귀 솔루션은 문제를 해결하기 위한 보다 우아한 접근 방식입니다.


카운트 다운 함수 


주어진 숫자에서 카운트 다운하는 함수를 만들어 봅시다. 우리는 이것을 이렇게 사용할 것입니다.


countDownFrom(5);
// 5
// 4
// 3
// 2
// 1

이 문제를 해결하기 위한 알고리즘이 있습니다.

  1. 숫자(number)라는 하나의 매개 변수를 사용하십시오. 이것이 우리의 출발점입니다.
  2. 숫자에서 0으로 이동하여 길을 따라 각각을 기록하십시오.

for 루프 방식으로 시작한 다음 재귀 방식과 비교해 보겠습니다.


명령 방식 (루프) 

function countDownFrom(number) {
	for (let i = number; i > 0; i--) {
		console.log(i);
	}	
}

countDownFrom(5);
// 5
// 4
// 3
// 2
// 1

여기에는 알고리즘 단계가 모두 포함됩니다.

  1. ✅ number라는 하나의 매개 변수를 사용하십시오.
  2. ✅ number 숫자에서 0까지 모든 것을 기록하십시오.


재귀적 접근 


function countDownFrom(number) {
	if (number === 0) {
		return;
	}

    console.log(number);    
    countDownFrom(number - 1);
}

countDownFrom(5);
// 5
// 4
// 3
// 2
// 1
  1. ✅ number라는 하나의 매개 변수를 사용하십시오.
  2. ✅ 숫자에서 0까지 모든 것을 기록하십시오.

개념적으로 두 가지 접근 방식은 동일합니다. 그러나 그들은 다른 방식으로 작업을 수행합니다.


명령형 솔루션 디버깅 


보다 시각적인 예를 들어, 루프 버전에 디버거를 넣고 Chrome 개발자 도구에 넣습니다.

function countDownFrom(number) {
	for (let i = number; i > 0; i--) {
		console.log(i);
		debugger;
	}	
}

countdownFrom-iterative 


추가 변수 i를 사용하여 현재 숫자를 추적하는 방법을 참조하십시오. 반복하면 i가 감소하여 결국 0에 도달하고 종료됩니다.


그리고 for 루프에서 "stop if i> 0"을 지정했습니다.


재귀 솔루션 디버깅 

function countDownFrom(number) {
	if (number === 0) {
		return;
	}

    console.log(number);
	
	debugger;

    countDownFrom(number - 1);
}

countdownFrom-recursive 


재귀 버전에는 진행률을 추적하기 위해 추가 변수가 필요하지 않습니다. 우리가 되풀이함에 따라 함수 더미 (호출 스택)가 어떻게 커지는가?


countDownFrom을 호출 할 때마다 스택에 추가되어 번호-1을 공급하기 때문입니다. 이렇게 하면 매번 업데이트 된 번호가 전달됩니다. 추가 상태가 필요하지 않습니다!


이것이 두 접근 방식의 주요 차이점입니다.

  • 반복은 내부 상태 (계산을 위한 추가 변수 등)를 사용합니다.
  • 재귀는 단순히 각 호출 사이에 업데이트 된 매개 변수를 전달하지 않습니다.


그러나 어느 버전이 언제 중지해야 하는지 어떻게 알 수 있습니까?


무한 루프 


당신의 여행에서, 당신은 무서운 무한 루프에 대해 경고했을 수 있습니다.

🚨 THIS RUNS FOREVER, BE WARNED 🚨
while (true) { console.log('WHY DID YOU RUN THIS?!' }

🚨 THIS RUNS FOREVER, BE WARNED 🚨
for (i = 0;;) { console.log('WHY DID YOU RUN THIS?!') }

이론적으로 영원히 실행되기 때문에 무한 루프는 프로그램을 중단 시키고 브라우저를 중단 시킬 수 있습니다. 항상 정지 조건을 코딩하여 이를 방지 할 수 있습니다.

✅ This does not run forever
x = 0;
while (x < 3) { console.log(x); x++; }

✅ This does not run forever
for (x = 0; x < 3; x++) { console.log(x); }

두 경우 모두 x를 기록하고 증가 시키고 3이 되면 멈춥니 다. countDownFrom 함수는 비슷한 논리를 가졌습니다.

// Stop at 0
for (let i = number; i > 0; i--)

다시, 루프는 언제 중지해야 하는지 결정하기 위해 추가 상태가 필요합니다. 그것이 x와 i를 위한 것입니다.


무한 재귀 


재귀도 같은 위험을 초래합니다. 브라우저를 손상 시키는 자체 참조 기능을 작성하는 것은 어렵지 않습니다.

🚨THIS RUNS FOREVER, BE WARNED🚨
function run() {
    console.log('running');
    run();
}

run();
// running
// running
// ...

정지 조건이 없으면 run은 영원히 호출됩니다. if 문으로 해결할 수 있습니다.

✅ This does not run forever

function run(x) {
    if (x === 3) return;
    
    console.log('running');
    run(x + 1);
}

run(0);
// running
// running
// running

// x is 3 now, we're done.

기본 케이스 

이것을 기본 사례라고 합니다. 재귀 countDownFrom에 하나가 있습니다.

if (number === 0) {
    return;
}

루프의 정지 로직과 같은 생각입니다. 어떤 접근 방식을 선택하든 항상 특정 시점에서 중지해야 한다는 것을 기억하십시오.


요약 

  • 재귀는 누군가가 그것을 중지 할 때까지 함수가 자신을 호출하는 것입니다.
  • 루프 대신 사용할 수 있습니다.
  • 아무도 멈추지 않으면 영원히 되풀이되어 프로그램이 중단됩니다.
  • 기본 사례는 재귀를 중지 시키는 조건입니다. 그것들을 추가하는 것을 잊지 마십시오!
  • 루프는 추적 및 카운팅에 추가 상태 변수를 사용하고 재귀는 제공된 매개 변수만 사용합니다.



  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

페이지 정보

조회 31회 ]  작성일19-09-06 09:36

웹학교