Ich weiß nicht, wie eine rekursive faktorielle Funktion ohne if-Anweisungen schreiben. Unser Professor sagte etwas über Lambda-Kalkül.Wie schreibe rekursive faktorielle Funktion in Haskell ohne, wenn dann sonst Statement
Antwort
Pattern Matching und Wächter sind zwei besonders einfache Wege. Wächter sind im Wesentlichen eine andere Syntax für Wenn-dann-sonst; Sie sehen so aus:
fac n | n < 2 = 1
| otherwise = n * fac (n-1)
Im Gegensatz zu if-then-else, unterstützen sie sauber mehrere Bedingungen; man könnte auch schreiben, zum Beispiel
fac n | n < 0 = error "nah"
| n == 0 = 1
| n == 1 = 1
| n > 1 = n * fac (n-1)
die würde viel weniger schön in Wenn-dann-sonst-Form aussehen.
mit Mustervergleich, würde man typischerweise schreiben mehrere Definitionsgleichungen:
fac 0 = 1
fac 1 = 1
fac n = n * fac (n-1)
Für Zahlen insbesondere diese auch zu desugars Wesentlichen ein if-then-else; aber für Datentypen mit weniger Compiler-Integration kann oft nicht mit if-then-else emuliert werden, und führt auch oft zu sehr natürlich aussehenden Code.
Ein anderer sehr netter Ansatz wäre, Ihre Rekursion in bestehende Prelude-Funktionen zu schieben; Je mehr Sie Iterationsmuster in der Praxis erkennen können, desto mehr Fehler können Sie vermeiden, indem Sie dieselben Schleifen nicht immer wieder neu implementieren. Für diese, könnten Sie product
und die spezielle Aufzählung Syntax:
fac n = product [1..n]
Eine erweiterte (und deutlich schlechter) Technik, um eine neue Art von Zahl zu definieren wäre; z.B. Kirchenziffern erlauben dem Hersteller der Nummer, die Rekursion zu steuern, und der Konsument (hier fac
) liefert nur Basisfälle. In diesem Stil, könnten Sie so etwas wie dies sehen:
fac n = fst (n (1,1) (\(prod, sum) -> (prod*sum, sum+1)))
(Beachten Sie aber auch, dass dies eine ganz besondere Art von Zahlen erfordert - sicherlich die Art der fac
ist nicht einer von einer Funktion, die Int
oder Integer
könnte annehmen !) Dieser Witz wird in The Evolution of a Haskell Programmer zu seiner logischen und erschreckenden Schlussfolgerung gebracht.
Vergessen Sie nicht das Musterabgleich auf dem 'Bool' von' (==) ', was sowohl Wächter als auch wenn/then/else Zucker sind .. (Haskell hat möglicherweise zu viele spezielle Möglichkeiten zu handhaben Bool) – Carl
Wenn/then/else und guards sind eigentlich nur syntaktischer Zucker für die Mustererkennung.
if b
then c
else d
desugars zu
case b of
True -> c
False -> d
, Ähnlich
f x
| b = c
| d = e
f x = g
desugars zu
f x = case b of
True -> c
False -> case d of
True -> e
False = g
So können Sie immer case
direkt verwenden. Es gibt jedoch eine ziemlich einfache Optimierung, die Sie von Hand durchführen können.Wenn Sie
case x == p of
True -> a
False -> b
sehen, wo p
von Konstrukteuren und Literale gemacht wird, kann man das Ganze mit
case x of
p -> a
_ -> b
ersetzen versuchen, diese:
factorial 0 = 1
factorial n = n * factorial (n - 1)
Mit Endrekursion:
factorial n = f n 1
f 0 acc = acc
f n acc = f (n-1) (acc*n)
main = print $ factorial 5
Ausgabe:
120
- 1. Wie schreibe ich eine faktorielle Funktion?
- 2. Wie schreibe ich dies als rekursive Haskell-Funktion?
- 3. Wenn sonst noch php statement
- 4. Wenn, dann sonst Funktion in Zugriff
- 5. wenn sonst Steuerfluss in Haskell
- 6. rekursive Addition in Haskell
- 7. Wenn dann sonst in Infopath (Xpath): wie?
- 8. Wie schreibe ich eine Konstante-Raum-Länge-Funktion in Haskell?
- 9. Wenn ... Dann ... Sonst mit mehreren Anweisungen nach Dann
- 10. Haskell „nichts tun“ IO, oder wenn ohne sonst
- 11. EXCEL VBA benutzerdefinierte Funktion - sonst ohne wenn
- 12. RxJs Partion wenn dann sonst
- 13. Haskell - Konvertieren der High-Order-Funktion in die rekursive Funktion
- 14. Rekursive Funktion ohne Schleife
- 15. Wie erstelle ich ein Wenn-Dann-Sonst in T-SQL
- 16. Haskell rekursive Funktion Beispiel mit foldr
- 17. Wenn dann sonst in XPath 1.0
- 18. Rekursive Tokenizer in Haskell
- 19. Haskell: Show rekursive Datentyp
- 20. Proving wenn dann sonst in Coq
- 21. Wie schreibe ich sonst Anweisungen in Brainfuck
- 22. Kompilierfehler "sonst ohne wenn"
- 23. Wie schreibe ich eine Haskell Pipes "sum" -Funktion?
- 24. Eine rekursive Funktion in VDM
- 25. Wie ich schreibe Wenn und sonst funktioniert in selen webdriver
- 26. Wie schreibe ich, wenn und sonst Aussage eleganter in Swift
- 27. Wie schreibe ich dies, wenn sonst Bedingungserklärung in MATLAB?
- 28. Rekursive Funktion zum Exponentialberechnen ohne "*"
- 29. Konvertieren in eine rekursive Funktion?
- 30. Haskell schreibe deine Version von (.) Funktion
https://en.wikibooks.org/wiki/Haskell/Pattern_matching – Ryan
[Ironisch Antwort] (https://www.willamette.edu/~fruehr/haskell/ evolution.html) – gallais