2017-12-14 7 views
-1

Einfache Neugier: Ich habe dieses Skript gefunden, die im Grunde alle natürlichen Zahlen erzeugt:erzeugen alle natürlichen Zahlen in js mit Generatoren und Rekursion, verschiedene Ansätze

function *naturalNumbers() { 
 
    function *_naturalNumbers(n) { 
 
    yield n; 
 
    yield *_naturalNumbers(n + 1); 
 
    } 
 

 
    yield* _naturalNumbers(1); 
 
} 
 

 
const nats = naturalNumbers(); 
 

 
console.log(nats.next().value) // 1 
 
console.log(nats.next().value) // 2 
 
console.log(nats.next().value) // 3

Ich verstehe nicht, warum es benutzt eine innere Funktion. Ich habe versucht, die Funktion auf diese Weise neu zu schreiben und scheint funktioniert:

function *naturalNumbers(n) { 
    yield n; 
    yield *naturalNumbers(n + 1); 
} 

Ist mein Umschreiben der Funktion falsch? Gibt es einen besonderen Grund, warum der Programmierer die Funktion so geschrieben hat?

+0

Beziehen Sie sich auf die Tatsache, dass Sie das '*' bewegt haben? – Olian04

+0

@ Olian04 Sieht aus wie das OP es so hatte '* naturalNumbers'. –

+0

@PraveenKumar, die von Ihnen bearbeitet wurde ... – Olian04

Antwort

1

Es verwendet eine innere Funktion, so dass Sie naturalNumbers() statt naturalNumbers(1) aufrufen können, um alle natürlichen Zahlen zu generieren.

Natürlich ist es nicht notwendig, eine geschachtelte Generatorfunktion dafür zu verwenden. Die folgenden Schnipsel würde auch funktionieren:

function* _naturalNumbers(n) { 
    yield n; 
    yield* _naturalNumbers(n + 1); 
} 
function naturalNumbers() { 
    return _naturalNumbers(1); 
} 

const naturalNumbers = (() => { 
    function* _naturalNumbers(n) { 
    yield n; 
    yield* _naturalNumbers(n + 1); 
    } 
    return() => _naturalNumbers(1); 
})(); 

const naturalNumbers = function* _naturalNumbers(n) { 
    yield n; 
    yield* _naturalNumbers(n + 1); 
}.bind(null, 1); 

Natürlich ist es auch Rekursion nicht notwendig, hier zu verwenden (in der Tat ist es ziemlich ineffizient), ich werde Das ist nur ein Spielzeugbeispiel, um die Funktion des Operators yield* zu demonstrieren.

Verwandte Themen