2017-01-13 2 views
1

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 xswü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!

+1

Nicht "Etwas * mit * faktorials" --- nur ein Faktor selbst. Auch - 'length $ permutations [1..16]' würde Haskell wahrscheinlich mit einem Speicherfehler zum Absturz bringen. –

+1

"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

+1

@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

Antwort

2

Dieser ist nicht korrekt:

numofperms 0 = 0 

die Anzahl der Permutationen von 0 Elemente 1 ist (permutations [] == [[]]). In diesem Sinne würde es vielleicht helfen, die Dinge kürzer zu machen:

f(0) = 1 
f(n) = n * f(n - 1) 

Bekannt? Es ist n! - die factorial.

Verwandte Themen