Es ist eine wohlbekannte Frage hier , die für ein kurzes (mindestens Zeichen) Fibonacci - Sequenz - Generator fragt.
Ich würde gerne wissen, ob jemand in sehr kurzer Zeit nur die ersten N Elemente der Fibonacci-Sequenz erzeugen kann. Ich versuche es in Python zu machen, aber ich bin an jeder kurzen Antwort in jeder Sprache interessiert. Die Funktion F (N) erzeugt die ersten N Elemente der Sequenz, gibt sie entweder als Rückgabe der Funktion zurück oder druckt sie aus.
Interessanterweise scheinen die Code-Golf-Antworten 1 1 2
stattdessen mit zu beginnen 0 1 1 2
. Ist das eine Konvention im Code-Golf oder im Programmieren im Allgemeinen? (Wikipedia sagt, dass die Fibonacci-Sequenz mit Null beginnt.)
Python-Beispiel (erste 5 Elemente):
def f(i,j,n):
if n>0:
print i;
f(j,i+j,n-1)
f(1,1,5)
F_0 = 0, F_1 = 1
oder gleichwertig definiertF_1 = 1, F_2 = 1
. Der Unterschied besteht darin, ob Sie die Sequenz bei Index 0 (häufiger in der Programmierung) oder 1 (häufiger in der Mathematik) beginnen möchten.F_0 = 0, F_1 = 1
hat einen eindeutigen Vorteil in der Einfachheit der Matrixdarstellung[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Antworten:
C.
Ich habe nicht gezählt, aber hier ist ein lustiges Beispiel:
Beweis, dass es funktioniert.
Darauf bin ich ziemlich stolz: Ich habe mich gelangweilt und meinen Code (mit ein paar kleinen Ergänzungen) neu angeordnet, damit jede Zeile einen Wert in der Fibonacci-Sequenz darstellt.
Beweis, dass es funktioniert.
quelle
a++<=b
->a++-b
undreturn--n<3?1:f(n)+f(n-1)
. Außerdem können Sie vermeiden,scanf
wenn Sie n benötigen, um dabei zu seinargc
.--n
im selben Ausdruck irrelevant ist. Brillant!4
es eigentlich eine geben sollte3
. Wie derzeit mit dem geschrieben<4
, ist die erzeugte Sequenz 1, 1, 1, 2, 3, 5, 8 ... Das ist eine zu viele Einsen.return n<3?n>0:f(--n)+f(--n);
Haskell (26)
Überraschenderweise ist dies nur ein Zeichen länger als die J-Lösung.
Ich rasiere ein paar Charaktere ab durch:
take
als binärer Operator;scanl
anstelle der ausführlichenzipWith
.quelle
s
ist so elegant, dass ich nicht weiß, wie sich jemand eine solche Lösung vorstellen würde! Was ich nicht wusste ist, dass Sies
beim Definieren wieder verwenden könnens
. (Ich bin noch ein Anfänger =)Hier ist ein einzeiliger Python. Es wird Gleitkomma verwendet, daher kann es einige geben,
n
für die es nicht mehr genau ist.F(n)
Gibt eine Zeichenfolge zurück, die die erstenn
Fibonacci-Zahlen enthält, die durch Leerzeichen getrennt sind.quelle
GolfScript, 16 Zeichen
Beispielausgabe:
quelle
Perl, 50 Zeichen
quelle
Scala 71:
druckt
quelle
Perl,
2928 BytesErläuterung
Dies basiert auf der klassischen
$b += $a = $b-$a
Wiederholung, die wie folgt funktioniert:$a
enthältF(n-2)
und$b
enthältF(n)
$a = $b-$a
$a
enthältF(n-1)
$b += $a
$b
enthältF(n+1)
Das Problem hierbei ist die Initialisierung. Der klassische Weg ist
$b += $a = $b-$a || 1
aber dann geht die Sequenz1 2 3 5 ...
Durch Erweitern der Fibonacci-Sequenz nach links:
Sie sehen, dass der richtige Ausgangspunkt
$a = -1
und ist$b = 0
. Das Initialisieren von $ a kann mit dem Einrichten der Schleife kombiniert werdenSchließlich ersetzt
$a
durch$;
, bevor die von dem Raum loszuwerdenfor
quelle
Ich kann Ihnen eine zweizeilige Python-Lösung geben. Dadurch werden sie als Liste zurückgegeben.
Sie könnten sie ausdrucken lassen, indem Sie eine weitere Karte hinzufügen, um sie zu Zeichenfolgen zu machen, und dann einen Join hinzufügen, aber das scheint mir einfach unnötig.
Leider weiß ich nicht, wie ich ein rekursives Lambda einfügen soll
map
, deshalb stecke ich in zwei Zeilen fest.quelle
g(100)
? ;)f(n)
mitn<=0
Rückgabe Ganzzahlen undn>0
Rückgabelisten, also .. vielleicht ist es nicht ideal:f = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
0
in Ihrer Antwort verpasst . Das Ändernf
zur Rückkehrn if n < 2
ist eine Problemumgehung. :)Python (78 Zeichen)
Ich habe Binets Formel verwendet , um die Fibonacci-Zahlen zu berechnen -
Es ist nicht so klein, einige der anderen Antworten hier, aber Junge, es ist schnell
quelle
print"11235"
:)2**i
.**
haben höhere Priorität als*
Planen
Dies wird durch Schwanzrekursion optimiert:
quelle
Haskell
Beweis, dass es funktioniert .
quelle
J, 25 Zeichen
Mir ist klar, dass J-Lösungen wahrscheinlich nicht das sind, wonach Sie suchen, aber hier ist trotzdem eine. :-)
Verwendungszweck:
Wie es funktioniert:
Ausgehend von rechts (weil J-Programme von rechts nach links gelesen werden),
2-~ 6
Der~
Operator kehrt das Argument zum Verb um, so dass dies dasselbe ist wie6-2
Wenn Sie den Abschnitt in Klammern vorerst ignorieren,
0 1(...)@[&0~ x
nehmen Sie das Verb in Klammern und führen Sie esx
mal aus, indem Sie die Liste0 1
als Eingabe verwenden.~
Kehren Sie die Argumente hier erneut um und geben Sie anx (...)@[&0 ] 0 1
, was bedeutet, dass ich die Eingabe am Ende der Funktion behalten kann.Innerhalb der Klammern ist eine Gabel ,
],+/&(_2&{.)
die aus drei Verben gemacht wird -]
,,
und+/&(_2&{.)
.Eine Gabel nimmt drei Verben
a b c
und verwendet sie wie folgt:(x a y) b (x c y)
Wox
undy
sind die Argumente für die Gabel. Das,
ist das zentrale Verb in dieser Gabel und verbindet die Ergebnisse vonx ] y
undx +/&(_2&{.) y
miteinander.]
Gibt das linke Argument unverändert zurück undx ] y
wertet es ausx
.+/&(_2&{.)
Nimmt die letzten beiden Elemente aus der angegebenen Liste(_2&{.)
- in diesem Fall0 1
- und addiert sie dann+/
(die&
s dienen nur als Klebstoff).Sobald das Verb funktioniert hat, wird das Ergebnis für den nächsten Lauf zurückgesendet und die Sequenz generiert.
quelle
TI-Basic, 43 Zeichen
Dieser Code kann direkt in das Hauptprogramm eingefügt oder in ein separates Programm umgewandelt werden, auf das das erste Programm verweist.
quelle
APL (33)
Verwendungszweck:
quelle
Python (55)
quelle
Powershell - 35 Zeichen
Powershell akzeptiert Pipeline- Eingaben , daher bin ich der Überzeugung, dass das
n |
Inn | <mycode>
nicht gegen meine Zählung sein sollte, sondern nur ein Teil der Initiierung einer "Funktion" in der Sprache ist.Die erste Lösung geht davon aus, dass wir bei 0 beginnen:
Die zweite Lösung geht davon aus, dass wir bei 1 beginnen können:
Beispielaufruf:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Ausbeuten:
Interessanterweise führten Versuche, den Overhead der
for()
Schleife zu vermeiden, zu derselben Zeichenanzahl :%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.quelle
Python, 43 Zeichen
Hier sind drei grundlegend unterschiedliche Einzeiler, die die Binet-Formel nicht verwenden.
Ich habe noch nie
reduce
so schlimm missbraucht .quelle
reduce
Missbrauchdc, 32 Zeichen:
Dies zeigt eigentlich immer die beiden ersten Einsen an, sodass die Funktion nur wie erwartet für N> = 2 funktioniert .
C, 75 Zeichen:
Nicht so cool wie die akzeptierte Antwort, aber kürzer und viel schneller:
Extra:CL, 64 Zeichen:
Eines meiner am häufigsten verwendeten Lesezeichen in diesem Semester hat ein interessantes Beispiel, das kürzer ist als
vieleder anderen hier, und es ist nur ein direkter Aufruf desloop
Makros - im Grunde nur eine Aussage! Ich habe es für alle Leerzeichen entfernt, die ich konnte:Ganz kurz und schön und lesbar! Zum Lesen von Eingaben
n
(einschließlich der umgebenden Leerzeichen) können(read)
3 Zeichen hinzugefügt werden.quelle
main
vier Argumente?FALSE, 28 Bytes
quelle
1_
anstatt0 1 -
Python 2, 38 Bytes
Eine Verbesserung gegenüber einer zuvor veröffentlichten Lösung:
Dies verwendet eine
exec
String-Multiplikation, um Schleifen zu vermeiden.Python 3, 46 Bytes
Nicht ganz so effizient in Python 3:
quelle
C99, 58 Zeichen
Die folgende Funktion füllt ein Array von Ganzzahlen mit den ersten
n
Werten aus der Fibonacci-Sequenz, beginnend mit 0.Testgeschirr
n
als Befehlszeilenargument:quelle
CoffeeScript, 48
65 in js:
quelle
PHP, 87
Verwendet
array_sum
und rekursive Funktion zum Generieren von Serien.Z.B:
quelle
F #, 123
quelle
Scala, 65 Zeichen
Dies druckt zum Beispiel die ersten 9 Fibonacci-Zahlen. Für eine benutzerfreundlichere Version, bei der die Sequenzlänge von der Konsoleneingabe übernommen wird, sind 70 Zeichen erforderlich:
Beachten Sie, dass die Verwendung eines Bereichs dies auf Int-Werte begrenzt.
quelle
Q 24
Erste n Fibonacci-Zahlen
quelle
Lua, 85 Bytes
Ich lerne Lua und möchte diese Sprache dem Pool hinzufügen.
und das Ganze dauerte 85 Zeichen, mit dem Parameter als Befehlszeilenargument. Ein weiterer guter Punkt ist, dass es leicht zu lesen ist.
quelle
FALSE, 20 Zeichen
Die Eingabe sollte sich auf dem Stapel befinden, bevor dies ausgeführt wird.
quelle
Pyt , 3 Bytes
Probieren Sie es online aus!
quelle
x86-Maschinencode - 379 Bytes
Die Version mit ELF-Headern mit 484 Bytes:
Headerless-Version (das ist die zu bewertende Version):
quelle