2012-10-27 2 views
5

나는 또한 리뷰 한 다른 게시물에 나오는 다음 함수에 붙어 있습니다. Eloquent Javascript 's findSequence clarification

function findSequence(goal) { 
    function find(start, history) { 
    if (start == goal) 
     return history; 
    else if (start > goal) 
     return null; 
    else 
     return find(start + 5, "(" + history + " + 5)") || 
      find(start * 3, "(" + history + " * 3)"); 
} 
    return find(1, "1"); 
} 

print(findSequence(24)); 

은 또한이 링크에 주어진. 상기 설명에서

Javascript..totally lost in this tutorial

는 응답이 그 대신 다음 제 (11)에 대해 테스트된다 (1)의 시동, 및도 11에 대해 테스트된다 (6)의 시작을 (11)의 목표를 설정하려고

나는이 처음 두 단계를 잘 알고 있습니다. 그러나 두 번째 단계 (start : 6을 goal : 11으로 비교)에서 세 번째 단계 (start : 3을 goal : 11으로 비교)의 도약을 이해할 수 없습니다.

어떻게 start이 6에서 3으로 다시 이동 한 다음 11 (4 번째 글 머리 기호)까지 백업합니까?

+0

영어는 제 첫 번째 언어입니다. –

+0

게시물에있는이 설명은 매우 유용합니다. 그래서 나는 대신 링크를 제공했습니다. – KMcA

+1

이 답변을 확인하십시오 - 아마도 명확히 할 수 있습니다. http://stackoverflow.com/questions/7540111/javascript-closure-tutorial-from-eloquent-javascript?lq=1 – c69

답변

7

다음은 콘솔 로그 명령문으로 개선 된 코드 버전입니다. 추적에보고, 시각적으로 재귀의 개념을 파악하는 것입니다 희망

function findSequence (goal) { 
    function find (start, history, depth) { 
    depth = depth || 0; 
    console.log(Array(++depth).join('--> '), start, goal, history); 
    if (start == goal) { 
     console.warn('history'); 
     return history; 
    } else if (start > goal) { 
     console.error('null'); 
     return null; 
    } else { 
     console.info('recursion!'); 
     return find(start + 5, "(" + history + " + 5)", depth) || 
      find(start * 3, "(" + history + " * 3)", depth); 
    } 
    } 
    return find(1, "1"); 
} 

console.info(findSequence(24)); 

당신은이 프로그램의 전화 추적을 얻을 것이다, 그리고 : 오픈 크롬/오페라/파이어 폭스 eveloper의 도구가이 코드를 실행합니다.

+0

나는 이것이 그가 개념을 이해하는 데 도움이 될 것이라는 데 동의하지만 그의 의견으로 나는 그의 혼란이'||'에 있다고 말한다. – pedrofurla

+0

그게 바로 내 질문을 완벽하게 답변하고 볼 필요가있는 것입니다. 고맙습니다. – KMcA

+1

pedrofurla, 왼쪽부터 결국 null을 반환하기 때문에 false이고, 오른쪽이 시작되도록 트리거합니다. 옳은? – KMcA