Javascript - Spara värdet av return

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

Javascript - Spara värdet av return

Hej,

Jag har en uppgift i skolan där jag ska i Javascript skriva en funktion som räknar ut Fibonaccis talföljd.
Det jag vill göra är att spara de tidigare värderna för att kunna spara tid om funktionen kallas igen.

Jag tror att jag har fått till själv koden för talföljden (se nedan) men hur gör jag för att inte behöva börja om igen om funktionen kallas igen? Jag vill alltså börja igen på de senaste värdet och använda mig utav cache för att göra detta.

function fibonacci(n) { if (n === 0 || n === 1) return n; else return fibonacci(n - 1) + fibonacci(n - 2); }

förtydligade
Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011

Tänk så här: Den enda data en (äkta) funktion känner till är dess argument. All data du vill använda i en funktion måste alltså komma in den vägen.

En funktion kan ha flera argument; exempel:

function add(a, b) { return a + b; }

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Registrerad
Jan 2017
Skrivet av Alling:

Tänk så här: Den enda data en (äkta) funktion känner till är dess argument. All data du vill använda i en funktion måste alltså komma in den vägen.

En funktion kan ha flera argument; exempel:

function add(a, b) { return a + b; }

Okej men går det inte att använda sig utav "Memoization"? Har googlat som en galning och ser att folk löst problemet med hjälp av det men jag kan inte förstå hur och varför?...

Trädvy Permalänk
Medlem
Registrerad
Dec 2012
Skrivet av david97:

Hej,

Jag har en uppgift i skolan där jag ska i Javascript skriva en funktion som räknar ut Fibonaccis talföljd.
Det jag vill göra är att spara de tidigare värderna för att kunna spara tid om funktionen kallas igen.

Jag tror att jag har fått till själv koden för talföljden (se nedan) men hur gör jag för att inte behöva börja om igen om funktionen kallas igen? Jag vill alltså börja igen på de senaste värdet och använda mig utav cache för att göra detta.

function fibonacci(n) { if (n === 0 || n === 1) return n; else return fibonacci(n - 1) + fibonacci(n - 2); }

Du kan använda dig utav en Array för att spara värden som du får tillbaka. Kolla in http://www.w3schools.com/jsref/jsref_push.asp, en funktion i javascript som lägger till något in i en array, vare sig det är en string eller en integer.

Trädvy Permalänk
Medlem
Registrerad
Jan 2011
Skrivet av david97:

Okej men går det inte att använda sig utav "Memoization"? Har googlat som en galning och ser att folk löst problemet med hjälp av det men jag kan inte förstå hur och varför?...

Om du verkligen vill använda dig av en sådan lösning, så kan du köra in svaren du får i t.ex en hashmap, och sedan kolla innan du börjar räkna om värdet redan finns i den hashmap:en.

Fibonacci används ibland för att visa rekursion, problemet är att det är ett helt värdelöst exempel då det finns så kallade closed-form expressions, dvs du kan bara räkna ut den direkt istället:

function fibonacci(n) { var phi = (1 + Math.sqrt(5))/2; return Math.floor((Math.pow(phi, n) / Math.sqrt(5)) + 0.5); }

Detta fungera upp till n strax över 1400, sedan skiter javascript på sig då variablerna får overflow. Formeln i sig gäller för alla värden på n, och går att läsa om på wikipedias artikel om fibonacci.