2012-10-27 15 views
5

Sono bloccato sulla seguente funzione che appare in alcuni altri post che ho anche recensito.Eloquent Javascript's findSequence chiarimenti

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

Fornito anche in questo collegamento.

Javascript..totally lost in this tutorial

Nella spiegazione di cui sopra, la risposta invece cercato di impostare un obiettivo di 11. Hanno un inizio di 1, che è prima testato contro 11, e quindi un inizio di 6 che viene testata contro 11

Capisco questi primi due passaggi. Tuttavia, non capisco il salto dal secondo passaggio (confronto start: 6 a goal: 11) al terzo passaggio (confronto start: 3 a goal: 11).

In che modo start passa da 6, indietro a 3 e quindi indietro fino a 11 (quarto punto)?

+0

L'inglese è la mia prima lingua. –

+0

Questa spiegazione nel post è molto utile, motivo per cui ho fornito il link. – KMcA

+1

controlla questa risposta - forse può chiarire. http://stackoverflow.com/questions/7540111/javascript-closure-tutorial-from-eloquent-javascript?lq=1 – c69

risposta

7

Ok, ecco una versione del codice che è stata migliorata con le istruzioni del registro della console. Aperte strumenti eveloper Chrome/Opera/Firefox ed eseguire questo codice si:

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

otterrete una traccia chiamata di questo programma, e si spera afferrare il concetto di ricorsione visivamente, cercando sulla traccia.

+0

Sono d'accordo che questo lo aiuterà a capire il concetto ma dai suoi commenti direi che la sua confusione sta nel' || '. – pedrofurla

+0

Questo è esattamente ciò di cui avevo bisogno di vedere e risponde perfettamente alla mia domanda. Grazie mille. – KMcA

+1

pedrofurla, quindi, poiché il lato sinistro restituisce infine null, è falso e fa scattare il lato destro per iniziare. Corretta? – KMcA