2012-10-27 7 views
5

Utknąłem na następującej funkcji, która pojawia się w kilku innych wpisach, które również przejrzałem.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)); 

Podano również pod tym linkiem.

Javascript..totally lost in this tutorial

W powyższym wyjaśnieniem, odpowiedź zamiast próbowali ustawić cel 11. Mają początek 1, który jest pierwszym badanym przeciw 11, a następnie początku 6, który jest testowany przed 11

Rozumiem te dwa pierwsze kroki. Jednak nie rozumiem skoku z drugiego etapu (porównanie start: 6 do goal: 11) do trzeciego kroku (porównanie start: 3 do goal: 11).

Jak zmienia się start od 6, z powrotem w dół do 3, a następnie z powrotem do 11 (czwarty punktor)?

+0

Angielski to mój pierwszy język. –

+0

To wyjaśnienie w poście jest bardzo przydatne, dlatego podałem ten link. – KMcA

+1

sprawdź tę odpowiedź - może to wyjaśnić. http://stackoverflow.com/questions/7540111/javascript-closure-tutorial- from-eloquent-javascript?lq=1 – c69

Odpowiedz

7

OK, tutaj jest wersja kodu, która została wzbogacona o instrukcje log konsoli. Otwarte narzędzia eveloper Chrome/Opera/Firefox i wykonać ten kod tam:

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)); 

dostaniesz śladu połączenia tego programu, i mam nadzieję, że będzie zrozumieć koncepcję rekursji Wizualnie patrząc na śladu.

+0

Zgadzam się, że to pomoże mu zrozumieć pojęcie, ale przez jego komentarze powiedziałbym, że jego zamieszanie leży w' || '. – pedrofurla

+0

To jest dokładnie to, czego potrzebowałem, aby zobaczyć i odpowiedzieć na moje pytanie doskonale. Dziękuję Ci bardzo. – KMcA

+1

pedrofurla, więc ponieważ lewa strona ostatecznie zwraca wartość null, jest to fałsz i uruchamia prawą stronę, aby rozpocząć. Poprawny? – KMcA

Powiązane problemy