Das ist die Frage :
Geben Sie bei einer positiven Ganzzahl num die Summe aller ungeraden Fibonacci-Zahlen zurück, die kleiner oder gleich num sind.
Die ersten beiden Zahlen in der Fibonacci-Sequenz sind 1 und 1. Jede zusätzliche Zahl in der Sequenz ist die Summe der beiden vorherigen Zahlen. Die ersten sechs Zahlen der Fibonacci-Sequenz sind 1, 1, 2, 3, 5 und 8.
Zum Beispiel sollte sumFibs (10) 10 zurückgeben, da alle ungeraden Fibonacci-Zahlen kleiner oder gleich 10 1, 1, 3 und 5 sind.
Das habe ich versucht
function sumFibs(num, total = [1, 1], n = (total.length - 1 + total.length - 2)) {
if(n == num){
return total;
}
total.push(n);
sumFibs(num, n = (total.length - 1 + total.length - 2), total);
};
Frage
Ist es möglich, meine Methode zu verwenden, damit dies funktioniert? Wenn ja, wie kann ich die Syntax korrigieren? Wenn nicht, wie würden Sie das Problem lösen?
Danke vielmals!
Vier Dinge
(1) Sie geben das Ergebnis des rekursiven Aufrufs nicht zurück, daher wird es niemals an den Anrufer weitergegeben:
sumFibs(4, [1, 1]) -> sumFibs(4, [1, 1, 2]) -> sumFibs(4, [1, 1, 2, 3])
<- [1, 1, 2, 3]
// v the return you do
// v the return you need too
(2) Beim rekursiven Aufruf ist die Reihenfolge der Argumente falsch.
(3) Anstatt die Länge des Arrays minus 1 zu nehmen, möchten Sie auf die Eigenschaft an dieser Position im totalArray zugreifen .
(4) Warum nargumentieren Sie eigentlich ? Da es nur darauf ankommt total, kann es auch nur eine Variable sein:
function sumFibs(num, total = [1, 1]) {
const n = total[total.length - 1] + total[total.length - 2];
if(n > num){
return total;
}
total.push(n);
return sumFibs(num, total);
}
console.log(sumFibs(19));
Fortsetzung Passing Style
Continuation Passing Style gibt Ihnen effektiv programmatisch return. Die rekursive Verwendung einer CPS-Funktion kann dazu führen, dass die Programmkomplexität in Luft aufsteigt.
const identity = x =>
x
const sumfib = (n = 0, then = identity) =>
n <= 0
? then(0, 1, 1) // base case
: sumfib // inductive: solve smaller subproblem
( n - 1
, (sum, fib, temp) =>
then(sum + fib, temp, fib + temp)
)
console.log
( sumfib(0) // 0 = 0
, sumfib(1) // 1 = 0 + 1
, sumfib(2) // 2 = 0 + 1 + 1
, sumfib(3) // 4 = 0 + 1 + 1 + 2
, sumfib(4) // 7 = 0 + 1 + 1 + 2 + 3
, sumfib(5) // 12 = 0 + 1 + 1 + 2 + 3 + 5
, sumfib(6) // 20 = 0 + 1 + 1 + 2 + 3 + 5 + 8
, sumfib(7) // 33 = 0 + 1 + 1 + 2 + 3 + 5 + 8 + 13
)
Schleife / Wiederholung
loopund recurgeben Sie uns die Möglichkeit, rekursive Programme wie das oben beschriebene zu schreiben, ohne dass ein Stapelüberlauffehler auftritt.
const recur = (...values) =>
({ recur, values })
const loop = f =>
{ let r = f()
while (r && r.recur === recur)
r = f(...r.values)
return r
}
const sumfib = (n = 0) =>
loop // <-- loop with vars
( ( m = n
, sum = 0
, fib = 1
, temp = 1
) =>
m <= 0 // <-- exit condition
? sum // <-- base case
: recur // <-- recur with updated vars
( m - 1
, sum + fib
, temp
, temp + fib
)
)
console.log
( sumfib(0) // 0 = 0
, sumfib(1) // 1 = 0 + 1
, sumfib(2) // 2 = 0 + 1 + 1
, sumfib(3) // 4 = 0 + 1 + 1 + 2
, sumfib(4) // 7 = 0 + 1 + 1 + 2 + 3
, sumfib(5) // 12 = 0 + 1 + 1 + 2 + 3 + 5
, sumfib(6) // 20 = 0 + 1 + 1 + 2 + 3 + 5 + 8
, sumfib(7) // 33 = 0 + 1 + 1 + 2 + 3 + 5 + 8 + 13
)
streamz
Sogenannte Streams sind interessant, weil sie möglicherweise unendliche Werte erzeugen können, aber wir müssen sie nicht alle auf einmal berechnen. Wieder können wir unser Programm in einfachen Worten definieren und nützliche Grundelemente die ganze harte Arbeit machen lassen -
const fibs =
stream(0, _ =>
stream(1, _ =>
streamAdd(fibs, fibs.next)))
console.log(streamTake(fibs, 10))
// [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]
console.log(streamTake(streamSum(fibs), 10))
// [ 0, 1, 2, 4, 7, 12, 20, 33, 54, 88 ]
Wir setzen nur stream, streamAdd, streamSum, und streamTake-
const emptyStream =
Symbol('emptyStream')
const stream = (value, next) =>
( { value
, get next ()
{ delete this.next
return this.next = next()
}
}
)
const streamAdd = (s1, s2) =>
s1 === emptyStream || s2 === emptyStream
? emptyStream
: stream
( s1.value + s2.value
, _ => streamAdd(s1.next, s2.next)
)
const streamSum = (s, sum = 0) =>
s === emptyStream
? emptyStream
: stream
( sum + s.value
, _ => streamSum(s.next, sum + s.value)
)
const streamTake = (s = emptyStream, n = 0) =>
s === emptyStream || n <= 0
? []
: [ s.value, ...streamTake(s.next, n - 1) ]
Erweitern Sie das folgende Snippet, um die Ergebnisse in Ihrem eigenen Browser zu überprüfen.
const emptyStream =
Symbol('emptyStream')
const stream = (value, next) =>
( { value
, get next ()
{ delete this.next
return this.next = next()
}
}
)
const streamAdd = (s1, s2) =>
s1 === emptyStream || s2 === emptyStream
? emptyStream
: stream
( s1.value + s2.value
, _ => streamAdd(s1.next, s2.next)
)
const streamSum = (s, sum = 0) =>
s === emptyStream
? emptyStream
: stream
( sum + s.value
, _ => streamSum(s.next, sum + s.value)
)
const streamTake = (s = emptyStream, n = 0) =>
s === emptyStream || n <= 0
? []
: [ s.value, ...streamTake(s.next, n - 1) ]
const fibs =
stream(0, _ =>
stream(1, _ =>
streamAdd(fibs, fibs.next)))
console.log(streamTake(fibs, 10))
// [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ]
console.log(streamTake(streamSum(fibs), 10))
// [ 0, 1, 2, 4, 7, 12, 20, 33, 54, 88 ]
Dies kann ohne einen Array-Akkumulator gelöst werden; Verwenden Sie nals Zähler und currund prevvars, um die Daten zu speichern, die zur Berechnung der Fibonacci-Reihe erforderlich sind. Wenn wir eine ungerade haben curr, addieren Sie sie zur laufenden Summe und geben Sie sie an den Aufrufstapel weiter.
const sumOddFibs = (n, curr=1, prev=0) => {
if (curr < n) {
return sumOddFibs(n, curr + prev, curr) + (curr % 2 ? curr : 0);
}
return 0;
};
console.log(sumOddFibs(10));
Abgesehen davon ist Rekursion ein ziemlich schlechtes Werkzeug für fast alles, was einen sequentiellen 0..n-Zähler beinhaltet. Iteration ist sinnvoller: weniger Aufwand, leichter zu verstehen und kein Risiko, den Aufrufstapel zu sprengen. Ich würde auch die Berechnung der Fibonacci-Reihe (was ein guter Anwendungsfall für einen Generator ist) von der Filterung der Seltsamkeit und der Summierung trennen, damit jeder Schritt unabhängig ist und wiederverwendet werden kann:
const sum = arr => arr.reduce((a, e) => a + e);
const odds = arr => arr.filter(e => e % 2);
function *fibsBelow(n) {
for (let prev = 0, curr = 1; curr < n;) {
yield curr;
const tmp = curr;
curr += prev;
prev = tmp;
}
}
console.log(sum(odds([...fibsBelow(10)])));
Jana Duggar äußerte sich offen zu ihrer Suche nach Liebe. Hier ist alles, was sie zu diesem Thema und ihrem fünfjährigen Zeitfenster für die Ehe gesagt hat.
„Outlander“-Star Sam Heughan verriet kürzlich, was er vom Set mitnehmen wird, um an Jamie Fraser zu erinnern, die Rolle, die ihn zum Star gemacht hat.
„She Loves You“ wurde in einer Stunde geschrieben, an einem Tag aufgenommen und war der Song der Beatles mit einem ihrer besten Auftritte in ihrer Karriere.
Dolly Parton und ihre Oma Bessie hatten eine besondere Beziehung. Oma Parton war sehr krank, aber das hielt Dolly nicht davon ab, ihr einen Streich zu spielen.
Man könnte meinen, Eiche oder Hickory seien robust, aber wenn es um die härtesten Hölzer der Welt geht, kommen sie nicht einmal annähernd heran.
Der Ozean ist voller Schönheit, birgt aber auch einige der furchterregendsten Meeresbewohner unseres Planeten. Viele dieser Tiere lauern tief unter der Meeresoberfläche, in der dunklen, von hohem Druck geprägten Tiefsee.
Wenn du gegen feindliche Monster kämpfst oder dich für PvP-Situationen ausrüstest, kann dir das Wissen um die besten Schwertverzauberungen in Minecraft einen entscheidenden Vorteil verschaffen. Durch das Verzaubern von Schwertern verursachst du mehr Schaden, erhältst mehr Beute von Monstern und verlängerst die Haltbarkeit deines Schwertes.
Wenn von sozialistischen Ländern die Rede ist, stellt man sich oft die vollständige Kontrolle durch den Staat und das Fehlen von Privateigentum vor. In der Praxis unterscheiden sich sozialistische Wirtschaftssysteme jedoch stark.
„Children“ hinterlässt einen Cameo-Auftritt eines großen Namens und einige verheerende Neuigkeiten
Dieser RAV4 soll sich in ausgezeichnetem Zustand befinden und ist bereit für eine Partie Reise nach Jerusalem.
Auf Drohnenaufnahmen ist zu sehen, dass die Feuerwehrleute offenbar Mühe haben, den Brand zu löschen.
„Eyes of Wakanda“ ist direkt mit dem MCU verknüpft und bietet Updates zu „X-Men ’97“, „What If...“, „Daredevil“ und mehr.
Ava Gardner war mit Mickey Rooney und Frank Sintra verheiratet und datete mehrere andere Hollywoodstars. Hier ist ein Rückblick auf Ava Gardners Dating-Geschichte.
John Cleese heiratete seine Frau Jennifer Wade im Jahr 2012. Hier erfahren Sie alles Wissenswerte über John Cleeses Frau Jennifer Wade.
Iman und David Bowie bekamen im Jahr 2000 ihre Tochter Alexandria „Lexi“ Jones. Hier erfahren Sie alles Wissenswerte über ihre Tochter Alexandria „Lexi“ Jones.
Walker Scobell ist ein US-amerikanischer Schauspieler. Hier finden Sie alles, was Sie über den Star aus „Percy Jackson und die Olympier“ wissen müssen.
Es fällt mir plötzlich auf, wie so oft. Es ist wieder die Mitte. <Nein, nicht die im Pazifik, du Schlappschwanz, die auf dem Jahrmarkt> Jede Schlagzeile laut…..
Im Jahr 2022, mit der Veröffentlichung von GPT-3, scheinen Schreibfähigkeiten an Bedeutung zu verlieren. Mit KI können auch Menschen mit schlechten Schreibkenntnissen hochwertiges Personal hervorbringen.
In der heutigen schnelllebigen und wettbewerbsintensiven Welt spielt die Karriere eine wichtige Rolle für das persönliche Wachstum, die finanzielle Stabilität und die allgemeine Lebenszufriedenheit. Viele Menschen befinden sich jedoch in einem unerbittlichen Kreislauf aus Stagnation und Unzufriedenheit, der ihr Berufsleben allmählich verkümmert.
Letzte Woche fiel mir eine Pressemitteilung auf, die über PressGazette (eine britische Nachrichten-Website für Medien) verschickt wurde. In dem Artikel wurde angekündigt, dass Acast, das skandinavische Podcast-Hosting- und Werbeunternehmen, ein Konsortium der „wahrscheinlich einflussreichsten“ Verlage im Podcasting leiten werde.