2016-12-22 10 views
2

이 질문은 설명적인 용어 "재귀"또는 "재귀 적"에 대한 명확성을위한 표준 질문/답변을위한 것입니다. 그리고 적용 할 수있는 한도 내에서 "자체를 참조하는 비 종결 절차"와 "반복 일정". JavaScript에서"재귀", "자체를 참조하는 비 종결 절차"및 "반복 일정"의 차이점은 무엇입니까?


  1. "재귀"사이의 정의와 차이점은 무엇입니까;
  2. "자체를 참조하는 비 종결 절차"; 및
  3. "반복 일정"
나는 종종 JavaScript에서 "재귀"의 명확한 정의는 무엇하지만, 함수가 호출 자체를 반복 할 때 사용되는 용어 "재귀"를 참조

?

함수의 패턴을 설명 할 때 "자체를 참조하는 비 종결 절차"또는 "반복 일정"이라는 용어를 거의 보지 못했습니다. 자주 "재귀 적"또는 "재귀"는 함수 호출 본문 내에서 프로세스를 시작한 원래 함수를 호출하는 패턴을 설명하는 데 사용됩니다.

"재귀"가 특정 기능 패턴에 적용 할 수없는 경우; "재귀", "자체를 참조하는 종료되지 않는 프로 시저"및 "반복 된 예약"사이의 명확한 정의와 구별은 무엇입니까?

+1

JavaScript에서 정의가 다른 이유는 무엇이라고 생각합니까? – Bergi

답변

2

재귀

나는 종종 자바 스크립트에서 "재귀"의 명확한 정의는 무엇하지만, 함수가 호출 자체를 반복 할 때 사용되는 용어 "재귀"를 참조

?

이 정의는 괜찮은 것처럼 보이지만 함수가 직접 재귀 적으로 호출 할 필요는 없으며 실행은 다시 호출되도록해야합니다. 함수가 직접 자신을 호출하지 않는 재귀의 예는 다음과 같습니다. 을 호출하면 C();이 호출되어 A();이 다시 호출됩니다.

반복 스케줄링

이 같은 함수는 반복 스케줄링 용도 :

A가 동일한 호출 스택에서 반복적으로 호출되지 때문에 재귀 아니다
function A (foo) { 
    var bar; 
    setTimeout(A, 0); 
    console.log('hello'); 
} 

. 현재 호출 스택이 완료되면 ('hello'가 기록됨을 의미) 이벤트 루프에서 A를 다시 호출하기 전에는 A가 호출됩니다.동기식 코드와 비동기식 코드의 차이점과는 별도로 중요한 점은 한 번에 foobar의 복사본이 하나만 있고 호출 스택이 커지지 않기 때문에 메모리 또는 최대 호출 스택 크기가없는 것입니다 재귀를 사용하는이 버전이있을 것 초과 오류 :이 로깅 문에 도달하기 전에이 경우

function A (foo) { 
    var bar; 
    A(); 
    console.log('hello'); 
} 

는 '안녕하세요'A 전화 자체를하기 때문에 인쇄되지 않습니다. 자체

종료되지 않는 방법을 의미

비 종결 절차는 무한 루프이다. 자체에 대한 언급은 다소 의미가 없습니다.

function A () { 
    // Never terminates 
    while (true) { 
     // If A() is called here, or before 
     // the loop you have infinite 
     // recursion and a stack size error 
    } 
    // If, instead, A() is called here, 
    // you just have an infinite-loop, 
    // since this statement is never reached 
} 
+0

세 번째 예제는 첫 번째 예제와 어떻게 다른가? 스택 크기 오류를 피할 수있다. 예를 들어'while' 문에서 어떤 점에서'break'를 사용하고'while' 루프 다음에'A()'가 호출 되는가? 미래의 재귀에서 어떤 시점에서 원래 함수의 비동기 호출입니까? 또는 원래 함수가 다시 호출되기 전에 함수 호출이 비동기 함수 호출을 포함 할 때 다른 평가가 있습니까? – guest271314

+0

세 번째 예제는 중단 점이 추가되고 루프 뒤에 'A();'가 호출되면 재귀와 다르지 않습니다. 스택 크기 오류가 발생합니다. – Paulpro

+0

"앞으로의 재귀에서 어떤 시점에서 원래 함수의 비동기 호출입니까?" 아니요 (반복 일정 예 참조). "원래 함수가 다시 호출되기 전에 함수 호출이 비동기 함수 호출을 포함 할 때 다른 평가가 있습니까?" 불가능합니다. 호출 스택이 완료된 후 모든 비동기 함수가 실행됩니다. 비동기 코드 이후에 동기 코드를 실행할 수 없습니다. – Paulpro