Die Herausforderung:
Schreiben Sie ein Programm oder eine Funktion, die eine positive Zahl eingibt und deren Fakultät zurückgibt .
Hinweis: Dies ist eine Code-Trolling- Frage. Bitte nehmen Sie die Frage und / oder die Antworten nicht ernst. Mehr Infos hier . Jede Code-Trolling- Frage ist auch eine Frage des Beliebtheitswettbewerbs , daher gewinnt die Antwort mit der höchsten Stimmenzahl.
popularity-contest
code-trolling
Alephalpha
quelle
quelle
Antworten:
Dies ist ein sehr einfaches numerisches Rechenproblem, das wir mit Stirlings Näherung lösen können :
Wie Sie sehen, enthält diese Formel eine Quadratwurzel, die wir auch approximieren müssen. Wir werden dafür die sogenannte "babylonische Methode" wählen , weil es wohl die einfachste ist:
Beachten Sie, dass die Berechnung der Quadratwurzel auf diese Weise ein gutes Beispiel für die Rekursion ist.
Wenn Sie alles in einem Python-Programm zusammenfassen, erhalten Sie die folgende Lösung für Ihr Problem:
Mit einer einfachen Modifikation kann das obige Programm eine übersichtliche Tabelle mit Fakultäten ausgeben:
Diese Methode sollte für die meisten Anwendungen ausreichend genau sein.
quelle
C #
Sorry, aber ich hasse rekursive Funktion.
quelle
Java
quelle
Python
Der beste Weg, um ein Problem zu lösen, ist natürlich die Verwendung regulärer Ausdrücke:
quelle
Haskell
Funktionscode ist effizienter Code. Versuchen Sie dies.
Warum trollt es:
Ich würde jeden Coder auslachen, der das geschrieben hat ... Die Ineffizienz ist wunderschön. Wahrscheinlich auch unverständlich für jeden Haskell-Programmierer, der keine Fakultätsfunktion schreiben kann.
Bearbeiten: Ich habe dies vor einer Weile gepostet, aber ich dachte, ich würde für zukünftige Menschen und Menschen, die Haskell nicht lesen können, klären.
Der Code nimmt hier die Liste der Zahlen 1 bis n, erstellt die Liste aller Permutationen dieser Liste und gibt die Länge dieser Liste zurück. Auf meinem Computer dauert es ungefähr 20 Minuten für 13 !. Und dann sollte es für 14 vier Stunden dauern! und dann zweieinhalb Tage für 15 !. Abgesehen davon, dass Ihnen irgendwann der Speicher ausgeht.
Bearbeiten 2: Eigentlich werden Sie wahrscheinlich nicht über genügend Arbeitsspeicher verfügen, da dies Haskell ist (siehe den Kommentar unten). Sie können ihn möglicherweise zwingen, die Liste auszuwerten und sie irgendwie im Speicher zu halten, aber ich weiß nicht genug über das Optimieren (und Nichtoptimieren) von Haskell, um genau zu wissen, wie das geht.
quelle
[1..n]
. - Eine bestimmte Permutation von[1..n]
, die für den Rest der Permutationen einem Thunk zugeordnet ist (Polynom inn
). - Ein Akku für dielength
Funktion.C #
Da es sich um ein mathematisches Problem handelt, ist es sinnvoll, eine Anwendung zu verwenden, die speziell für die Lösung mathematischer Probleme entwickelt wurde, um diese Berechnung durchzuführen ...
Schritt 1:
Installieren Sie MATLAB. Ich denke, eine Testversion wird funktionieren, aber dieses superkomplizierte Problem ist wahrscheinlich wichtig genug, um die Vollversion der Anwendung zu erwerben.
Schritt 2:
Binden Sie die MATLAB COM-Komponente in Ihre Anwendung ein.
Schritt 3:
quelle
C #
Factorials sind eine übergeordnete mathematische Operation, bei der es schwierig sein kann, alles auf einmal zu verdauen. Die beste Lösung für solche Programmierprobleme besteht darin, eine große Aufgabe in kleinere Aufgaben zu unterteilen.
Nun, n! ist definiert als 1 * 2 * ... * n, also im Wesentlichen wiederholte Multiplikation, und Multiplikation ist nichts anderes als wiederholte Addition. In diesem Sinne löst das Folgende dieses Problem:
quelle
Trolle:
z = n - 1 + 1
) dokumentiert sich selbst, wenn Sie wissen, was los ist.p[]
eine rekursive Berechnung der Serienkoeffizienten verwenden!(Es ist die Lanczos-Näherung der Gammafunktion )
quelle
- 1 + 1
? Mein Compiler optimiert es (es ist keine Fließkommazahl, bei der die Optimierung von Code wie diesem gefährlich sein könnte), sodass es nicht erforderlich zu sein scheint.double z = n - 1
ist Teil der Approximation der Gammafunktion. Das+ 1
ist aus der Beziehung, diegamma(n + 1) = n!
für die ganze Zahl n.Wir alle wissen vom College, dass die effizienteste Methode zur Berechnung einer Multiplikation die Verwendung von Logarithmen ist. Warum sonst würden die Leute Logarithmentabellen für Hunderte von Jahren benutzen?
Also von der Identität
a*b=e^(log(a)+log(b))
bilden wir den folgenden Python-Code:Es erstellt eine Liste von Zahlen aus
1
bis erstelltx
(+1
wird benötigt, weil Python saugt), der Logarithmus der einzelnen berechnet, die Zahlen summiert, das e zur Potenz der Summe erhöht und schließlich den Wert auf die nächste Ganzzahl gerundet (weil Python saugt). . Python verfügt über eine integrierte Funktion zum Berechnen von Fakultäten, funktioniert jedoch nur für Ganzzahlen, sodass keine großen Zahlen erzeugt werden können (weil Python nervt). Aus diesem Grund wird die obige Funktion benötigt.Übrigens, ein allgemeiner Tipp für Studenten ist, dass wenn etwas nicht wie erwartet funktioniert, es wahrscheinlich daran liegt, dass die Sprache nicht stimmt.
quelle
Leider fehlt Javascript eine eingebaute Möglichkeit, die Fakultät zu berechnen. Sie können seine Bedeutung jedoch in der Kombinatorik verwenden, um den Wert dennoch zu bestimmen:
Die Fakultät einer Zahl n ist die Anzahl der Permutationen einer Liste dieser Größe.
Wir können also jede Liste mit n-stelligen Zahlen generieren, prüfen, ob es sich um eine Permutation handelt, und in diesem Fall einen Zähler inkrementieren:
Trolle:
O(n)
, nichtO(n!)
, aberO(n^n)
. Dies allein hätte ausgereicht, um sich hier zu qualifizieren.number.toString(base)
, aber das funktioniert nicht für Basen über 36. Ja, ich weiß 36! ist viel , aber immer noch ...Math.pow
? Nein? Naja.++
außerhalb von for-Loops macht es noch mysteriöser. Auch==
ist schlecht.$i
.new Array
,document.write
(mit Freunden) undalert
(statt einer Eingabeaufforderung oder ein Eingangsschild) eine vollständige trifecta der Funktion Wahl Sünden bilden. Warum wird die Eingabe doch dynamisch hinzugefügt?=
noch schwerer zu lesen.quelle
Ruby und WolframAlpha
Diese Lösung verwendet die WolframAlpha-REST-API zur Berechnung der Fakultät, wobei RestClient zum Abrufen der Lösung und Nokogiri zum Parsen der Lösung verwendet wird. Es erfindet keine Räder neu und nutzt bewährte und beliebte Technologien, um das Ergebnis auf modernste Weise zu erzielen.
quelle
Javascript
Javascript ist eine funktionale Programmiersprache, das heißt, Sie müssen Funktionen für alles verwenden, weil es schneller ist.
quelle
r = -~(function(){})
wird das sicher lösen.Bogo-Sort in Java verwenden
Dies funktioniert eigentlich nur sehr langsam und ist bei höheren Zahlen nicht korrekt.
quelle
PERL
Factorial kann ein schweres Problem sein. Eine Map / Reduce-ähnliche Technik kann - genau wie Google - die Mathematik aufteilen, indem eine Reihe von Prozessen abgebrochen und die Ergebnisse gesammelt werden. Dadurch werden in einer kalten Winternacht all diese Kerne oder CPUs in Ihrem System optimal genutzt.
Speichern Sie als f.perl und chmod 755, um sicherzustellen, dass Sie es ausführen können. Sie haben den pathologisch vielseitigen Mülleimer installiert, nicht wahr?
Trolle:
quelle
ARGV[0]
tatsächlich das erste Argument und nicht das Skript ist!$ARGV[0]
weil die meisten Sprachen, die ich ein bisschen kenne, es dort habenPython
Nur ein O (n! * N ^ 2) Algorithmus, um die Fakultät zu finden. Grundfall behandelt. Keine Überläufe.
quelle
Nun, es gibt eine einfache Lösung in Golfscript. Sie könnten einen Golfscript-Interpreter verwenden und diesen Code ausführen:
Einfach huh :) Viel Glück!
quelle
!
Mathematica
Es scheint nicht für Zahlen größer als 11 zu funktionieren, und Fakultät [11] hat meinen Computer eingefroren.
quelle
Rubin
Der langsamste Einzeiler, den ich mir vorstellen kann. Die Berechnung auf einem i7-Prozessor dauert 2 Minuten
6!
.quelle
Der richtige Ansatz für diese schwierigen mathematischen Probleme ist ein DSL. Also werde ich dies in einer einfachen Sprache modellieren
Um unser DSL gut zu schreiben, ist es hilfreich, es als freie Monade anzusehen, die vom algebraischen Funktor generiert wird
Wir könnten dies in Haskell als schreiben
Ich überlasse es dem Leser, die triviale Umsetzung von abzuleiten
Nun können wir eine Operation beschreiben, um eine Fakultät in dieser DSL zu modellieren
Nachdem wir dies modelliert haben, müssen wir lediglich eine tatsächliche Interpretationsfunktion für unsere freie Monade bereitstellen.
Den Rest der Bezeichnung überlasse ich dem Leser.
Um die Lesbarkeit zu verbessern, ist es manchmal hilfreich, einen konkreten AST des Formulars vorzulegen
und dann gleich eine triviale Überlegung
und dann ist es einfach, den AST rekursiv auszuwerten.
quelle
Python
Nachfolgend finden Sie eine Python-Version der Lösung, die nicht auf das 32-Bit-Limit (oder 64-Bit-Limit auf einem neueren System) für Ganzzahlen in Python beschränkt ist. Um diese Einschränkung zu umgehen, werden wir eine Zeichenfolge als Eingabe und Ausgabe für diefactorial
Routine verwenden und die Zeichenfolge intern in ihre Ziffern aufteilen, um die Multiplikation durchführen zu können.Hier ist der Code: Die
getDigits
Funktion teilt eine Zeichenfolge, die eine Zahl darstellt, in ihre Ziffern auf, sodass "1234" wird[ 4, 3, 2, 1 ]
(die umgekehrte Reihenfolge vereinfacht nur die Funktionenincrease
undmultiply
). Dieincrease
Funktion nimmt eine solche Liste und erhöht sie um eins. Wie der Name schon sagt,multiply
multipliziert sich die Funktion, z. B. wirdmultiply([2, 1], [3])
zurückgegeben,[ 6, 3 ]
weil 12 mal 3 gleich 36 ist. Dies funktioniert genauso, als würden Sie etwas mit Stift und Papier multiplizieren.Dann endlich, die
factorial
verwendet Funktion diese Hilfsfunktionen die tatsächlichen faktorielles zu berechnen, zum Beispielfactorial("9")
gibt"362880"
als Ausgabe.Anmerkungen
In Python gibt es für eine Ganzzahl kein Limit. Wenn Sie dies also manuell tun möchten, können Sie dies einfach tun
Es gibt auch die sehr bequeme
math.factorial(n)
Funktion.Diese Lösung ist offensichtlich weitaus komplexer als nötig, funktioniert jedoch und zeigt in der Tat, wie Sie die Fakultät berechnen können, wenn Sie auf 32 oder 64 Bit begrenzt sind. Obwohl niemand glauben wird, dass dies die Lösung für dieses einfache (zumindest in Python) Problem ist, können Sie tatsächlich etwas lernen.
quelle
Python
Die vernünftigste Lösung besteht eindeutig darin, alle Zahlen zu überprüfen, bis Sie diejenige finden, die die Fakultät der angegebenen Zahl ist.
quelle
Eine eleganteste rekursive Lösung in C
Jeder weiß, dass die elegantesten Lösungen für Fakultäten rekursiv sind.
Fakultät:
Die Multiplikation kann aber auch rekursiv als sukzessive Addition definiert werden.
Multiplikation:
Und so lassen sich auch nacheinander Inkrementierungen vornehmen.
Zusatz:
In
C
, können wir verwenden++x
und--x
die Grundelemente zu handhaben(x + 1)
und(x - 1)
jeweils, so dass wir alles definiert haben.Probieren wir es aus:
Perfekt, obwohl 8! hat aus irgendeinem Grund lange gedauert. Na ja, die elegantesten Lösungen sind nicht immer die schnellsten. Lass uns weitermachen:
Hmm, ich werde dich wissen lassen, wenn es zurückkommt ...
quelle
Python
Wie die Antwort von @ Matt_Sieker zeigt, lassen sich Fakultäten in Additionen aufteilen - warum das Aufteilen von Aufgaben die Essenz der Programmierung ist. Aber wir können das durch 1 aufschlüsseln!
Ich denke dieser Code garantiert einen SO Fehler, weil
Rekursion - erwärmt es
Jede Ebene generiert Aufrufe zum Multiplizieren
das ruft nach addnumbers auf
das ruft addby1 auf!
Zu viele Funktionen, oder?
quelle
Gehen Sie einfach zu Google und geben Sie Ihre Fakultät ein:
http://lmgtfy.com/?q=5!
quelle
TI-Basic 84
Es funktioniert wirklich :)
quelle
Javascript
Es ist offensichtlich die Aufgabe eines Programmierers, so wenig wie möglich zu arbeiten und so viele Bibliotheken wie möglich zu nutzen. Daher möchten wir jQuery und math.js importieren . Nun ist die Aufgabe so einfach:
quelle
Python
Mit nur einer geringfügigen Änderung der standardmäßigen rekursiven faktoriellen Implementierung wird sie für n> 10 unerträglich langsam.
quelle
Bash
quelle
Versuchen wir es mit der Monte-Carlo-Methode . Wir alle wissen, dass die Wahrscheinlichkeit, dass zwei zufällige n -Permutationen gleich sind, genau 1 / n beträgt ! . Daher können wir nur überprüfen, wie viele Tests benötigt werden (nennen wir diese Nummer b ), bis wir c Treffer erhalten. Dann n! ~ b / c .
Sage sollte auch in Python funktionieren
quelle
Bash
Factorials lassen sich mit den bekannten Kommandozeilen-Tools von bash leicht ermitteln.
Wie @Aaron Davies in den Kommentaren erwähnt hat, sieht das viel aufgeräumter aus und wir wollen alle ein schönes und aufgeräumtes Programm, nicht wahr?
quelle
paste
Befehl:seq 1 $n | paste -sd\* | bc
paste
sieht aus wie ein normales englisches Wort und ist damit leicht zu merken. Wollen wir das wirklich? ; o)