Geben Sie in Haskells GHCi length$ permutations [1..8]
ein und es ist sofort verfügbar. Mit length$ permutations [1..16]
Sie schauen .. Minuten, Stunden vielleicht? Wenn alles, was wir wollen, ist die tatsächliche Anzahl der Ergebnisse, die permutations xs
würde produzieren (dh. Nicht durch sie durchlaufen müssen) gibt es offensichtlich eine einfache billige Formel nur die length
von xs
kennen.Berechnen der `Länge` von 'Permutationen xs`
ich mit der Mathematik leider langsam bin, aber da len = length xs
, bemerkte ich, dass die Antwort, indem sie eine positive len
zu finden ist:
numofperms 0 = 0
numofperms 1 = 1
numofperms ln = ln * (numofperms (ln - 1))
Aber während dies ist offensichtlich schneller als die Bewertung alle permutations
, warum Rekursiv! Ich bin mir sicher, dass sich dort eine "Formel" versteckt, die ich nicht sofort/intuitiv sehen kann. Wie würde man die obige Logik in eine einfache, nicht rekursive mathematische Berechnung übersetzen? "Etwas mit faktorials" oder so etwas?
Bevor Sie als Duplikat markieren: Ich bin sicher, dass ich einfach „die Antwort, auf die Formel, um die Anzahl der Permutationen gibt“ oder elsewere leicht hier finden kann, aber die eigentliche Frage (wenn auf dieses Format erlaubt) Wie springt man von der intuitiv geschriebenen rekursiven Logik zu billigeren und korrekeren Berechnungen wie in (x * (x+-foo^bar))
--- das kann sicherlich ein pädagogischer Thread in dieser Hinsicht für andere angehende funktionale Programmierer werden, die hier in der Zukunft ankommen!
Nicht "Etwas * mit * faktorials" --- nur ein Faktor selbst. Auch - 'length $ permutations [1..16]' würde Haskell wahrscheinlich mit einem Speicherfehler zum Absturz bringen. –
"Wie springt man von der intuitiv geschriebenen rekursiven Logik zu billigeren und korrekten Berechnungen wie in' (x * (x + -foo^bar)) '" - Mathe, und es ist nicht immer intuitiv. Es gibt ein paar allgemeine Dinge, die man für einfache Fälle ausprobieren kann, aber im Allgemeinen, uh ... muss man es nur lösen. https://en.wikipedia.org/wiki/Closed-form_expression? – Ryan
@JohnColeman: "Länge" hält sich nicht an vergangenen Ergebnissen fest, also würde Haskell nur eine lange Zeit brauchen, um es zu bewerten. – Ryan