Hintergrund
Fast jeder kennt die Fibonacci-Zahlen F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Diese werden durch die Rekursionsfunktion F(n) = F(n-1) + F(n-2)
mit F(0)=0
und gebildet F(1)=1
. A000045
Eine eng verwandte Folge sind die Lucas-Zahlen L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Diese werden durch die Rekursionsfunktion L(m) = L(m-1) + L(m-2)
mit L(0)=2
und gebildet L(1)=1
. A000032
Wir können zwischen den beiden Sequenzen basierend auf geraden / ungeraden Indizes mit der Konstruktion wechseln,
A(x) = F(x)
wenn x mod 2 = 0
und A(x) = L(x)
sonst. Zum Beispiel A(4)
ist gleich F(4)
da 4 mod 2 = 0
. Wir werden diese Sequenz rufen die Lucas-Nacci Zahlen , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Dies kann durch die Rekursion Funktion gebildet werden , A(x) = 3*A(x-2) - A(x-4)
mit A(0)=0
, A(1)=1
, A(2)=1
, und A(3)=4
. A005013
Herausforderung
Geben Sie bei gegebener Eingabe n
die Zahlenfolge n+1
bis einschließlich A(n)
wie oben beschrieben aus. Es werden nur wenige Bytes (oder Byte-Äquivalente, z. B. für LabVIEW , die individuell auf Meta festgelegt wurden) gewonnen.
Eingang
Eine einzelne nicht negative Ganzzahl n
.
Ausgabe
Eine Liste von Zahlen, die der Folge von Lucas-Nacci-Zahlen von A(0)
bis entsprechen A(n)
. Die Liste muss in der oben beschriebenen Reihenfolge vorliegen.
Regeln
- Es gelten die Standardregeln für Code-Golf und Lückenbeschränkungen .
- Es gelten die Standard-Ein- / Ausgaberegeln .
- Die eingegebene Nummer kann in einem beliebigen geeigneten Format vorliegen: unär oder dezimal, gelesen von STDIN, Funktion oder Befehlszeilenargument usw. - Sie haben die Wahl.
- Die Ausgabe kann auf STDOUT gedruckt oder als Ergebnis des Funktionsaufrufs zurückgegeben werden. Wenn gedruckt, müssen geeignete Trennzeichen zur Unterscheidung der Zahlen enthalten sein (durch Leerzeichen, durch Kommas getrennt usw.).
- Bei der Ausgabe auf STDOUT sind außerdem umgebende Leerzeichen, abschließende Zeilenumbrüche usw. optional.
- Wenn die Eingabe eine Nicht-Ganzzahl oder eine negative Ganzzahl ist, kann das Programm alles oder nichts tun, da das Verhalten undefiniert ist.
Beispiele
Input -> Output
0 -> 0
5 -> 0, 1, 1, 4, 3, 11
18 -> 0, 1, 1, 4, 3, 11, 8, 29, 21, 76, 55, 199, 144, 521, 377, 1364, 987, 3571, 2584
Antworten:
Gelee, 12 Bytes
Probieren Sie es online!
Hintergrund
Wir können F und L auf -1 erweitern, indem wir F (-1) = 1 und L (-1) = -1 definieren. Dies stimmt mit der rekursiven Funktion überein.
Unser Programm beginnt mit
In jedem Schritt, um das nächste Paar zu bilden, kehren wir das letzte Paar um und addieren es zum vorletzten Paar. Beispielsweise:
Wenn wir diesen Prozess für einige weitere Schritte fortsetzen, erhalten wir
Die Lucas-Nacci-Sequenz ist einfach die linke Spalte.
Wie es funktioniert
‡
С
blick auf die beiden links:2
undU+¥
. Da der am weitesten links stehende ein Nil ist, kann er nicht der Körper der Schleife sein. DaherU+¥
wird als Hauptteil eine Zahl aus der Eingabe gelesen. Da es keine Befehlszeilenargumente gibt, wird diese Nummer aus STDIN gelesen.quelle
CJam,
2120 BytesVielen Dank an Sp3000 für das Speichern von 1 Byte.
Teste es hier.
Erläuterung
Verwendet einfach die in der Herausforderungsspezifikation angegebene Wiederholung.
quelle
Perl 6, 42 Bytes
Verwendung
quelle
{( (0,1,*+*...*) Z (2,1,*+*...*) ).flat.rotor( 1=>2, 1=>0 )[ 0..$_ ].flat}
(0,1,1,4,{$^b;$^d;3*$^c-$^a}...*)[^(n+1)]
.Haskell,
59,57,56,52, 51 BytesDie Seriendefinition wurde anhand dieser Antwort angepasst .
Weniger golfen:
fibLike start
gibt eine unendliche Liste definiert:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
Gibt 2 für ungerade Eingaben (Lucas-Reihe) oder 0 für gerade Eingaben (Fibonacci-Reihe) zurück.lucasNacci i
gibt die i-te Lucas-nacci-Nummer an.firstN n
Karten über die Liste.Ein Byte von Boomerang gespeichert.
quelle
2*mod i 2
inl
dann Sie die Klammer entfernen können. Wiel a=2*mod a 2:scanl(+)1(l a)
f n=[l i!!i|i<-[0..n]]
ES6, 65 Bytes
Verwendet die in der Frage angegebene Wiederholungsrelation.
quelle
Retina ,
706259 BytesProbieren Sie es online aus
1?
$`¶
- Erstellen Sie für jede Zahl eine Zeile von 0 bis n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
-ff
An ungerade Zeilen anhängen . Dadurch wird die Funktion mit L (0) = 2 gesetzt.m`$
f
-f
An alle Zeilen anhängen (Leerzeichen beachten). Dies setzt die Funktion für Fibonacci-Zahlen auf 0 und 1 und für Lucas-Zahlen auf 2 und 1.+`1(f*) (f*)
$2 $2$1
- Schleife: Berechne F (n + 1) = F (n) + F (n-1), solange noch 1s vorhanden sind.f*
- Entfernen Sie F (n + 1) vom Ende jeder Zeile.
f
s zurück auf 1s. Wenn dies nicht benötigt wird und wir beif
s bleiben können , beträgt die Länge nur 55 Bytes.quelle
Oracle SQL 11.2,
218216201 BytesNicht golfen
Ich habe es geschafft, ein paar Bytes zu gewinnen, indem ich die SIGN-Funktion verwendet habe, um die ersten drei Elemente der Sequenz zu generieren.
quelle
Japt,
252221 BytesTesten Sie es online!
Hintergrund
Es ist etwas schwierig, eine Fibonacci-Sequenz in Japt zu erstellen, aber wir haben eine integrierte Funktion
Mg
, um dies für uns zu tun. Dies gibt uns jedoch nur die Fibonacci-Sequenz, nicht die Lucas-Sequenz. Wir können die Lucas-Sequenz ziemlich einfach mit diesem Trick erreichen:Wie Sie sehen können,
F(N-1) + F(N+1)
istL(N)
für alle gleichN
. Da wir jedoch nur Lucas-Zahlen für die ungeraden Indizes benötigen, können wir die beiden Formeln zu einer kombinieren:Wie es funktioniert
quelle
Mathematica,
5251 BytesGanz ähnlich wie oben bei Martin habe ich einige Zeit damit verbracht, einen kürzeren Weg zu finden, um die "Basisfälle" für die Funktion zu definieren. Polynominterpolation war eine Pleite, daher habe ich die Erweiterung in Negative verwendet, um eine ziemlich kurze Definition zu erhalten.
quelle
Mathematica, 56 Bytes
Sehr einfache Implementierung. Definiert eine Hilfsfunktion
f
und wertet sie dann zu einer unbenannten Funktion aus, dief
auf einen Bereich angewendet wird, um alle Ergebnisse zu erhalten. Das fühlt sich unnötig umständlich an.Eine einzelne unbenannte Funktion scheint jedoch ein Byte länger zu sein:
quelle
MATL , 17
18BytesFast direkte Übersetzung von Martins CJam-Antwort .
Probieren Sie es online!
quelle
Brachylog , 51 Bytes
Dies nimmt eine Zahl als Eingabe und druckt diese in STDOUT aus, wobei die einzelnen Zahlen durch Leerzeichen voneinander getrennt sind.
Erläuterung
Die Kürzung
!
in der ersten Regel von Unterprädikat 1 ist notwendig, damit wir beim Zurückverfolgen (\
) nicht in einer Endlosschleife enden, in der der Interpreter die zweite Regel für eine Eingabe unter 4 versucht.quelle
Mathematica, 41 Bytes
quelle
Groovy, 50 Bytes
Dies definiert die Funktion x, die n als erstes Argument aufnimmt und den Basisfall der ersten vier Zahlen in der Fibocas-Sequenz als Standardargumente für den Rest der Funktion hat.
a hier ist n. b, c, d und e sind die nächsten vier Elemente in der Sequenz.
Es dekrementiert n und rekursiv, bis n kleiner als Null ist. Wenn es rekursiv ist, addiert es das erste Element in seiner aktuellen Sequenz zum endgültigen Rückgabewert. Die neuen Werte für die nächsten vier Elemente in der Sequenz werden dem rekursiven Aufruf übergeben - die letzten drei Elemente werden auf die ersten drei verschoben, und ein neues viertes Element wird aus zwei der vorherigen Elemente mit 3 * db generiert.
Neue Werte werden durch Listenverschachtelungen begrenzt, da groovy mehrere Werte zurückgeben kann, indem sie in eine Liste eingefügt werden. Daher gibt jeder Aufruf das aktuelle erste Element und das Ergebnis der Rekursion zurück, bei dem es sich um eine eigene Liste handelt.
quelle
R , 55 Bytes
Probieren Sie es online!
quelle
Pylone , 19
Dies ist eine ziemlich direkte Übersetzung von Martins Ansatz.
Wie es funktioniert:
quelle
DUP , 32 Bytes
Try it here!
Ein anonymes Lambda, das eine Folge von Zahlen auf dem Stapel hinterlässt. Verwendung:
Erläuterung
quelle
Python 2, 71 Bytes
Das scheint definitiv zu lang. Es hat mich jedoch gefreut, dass ich den bitweisen
not
Operator ... zweimal verwenden durfte. Einmal als eine Art Parität hin und her, und einmal, um die Rekursion zu beenden, wennn
erreicht-1
.Die Variable
p
ist immer entweder0
oder-1
und wechselt zwischen Einträgen0
oder-1
der Liste. (Wenn Sie den Eintrag-1
einer Python-Liste wählen, müssen Sie das letzte Element auswählen.)quelle
C ++ Template Meta Programming, 130 Bytes
Rekursive Definitionen schreien irgendwie nach C ++ TMP, Verwendung:
mit
x
dem, wasA(x)
du magst.quelle