Η δυνατότητα κάτι να ορίζεται με βάση τον εαυτό του ονομάζεται αναδρομή. Στην F#, η αναδρομή συναντάται πιο συχνά σε αναδρομικές συναρτήσεις, δηλαδή συναρτήσεις που καλούν τον εαυτό τους.
Μια αναδρομική συνάρτηση πρέπει να έχει τουλάχιστον μία βασική περίπτωση και τουλάχιστον μία αναδρομική περίπτωση. Μια βασική περίπτωση επιστρέφει μια τιμή χωρίς να καλέσει ξανά τη συνάρτηση. Μια αναδρομική περίπτωση καλεί ξανά τη συνάρτηση, τροποποιώντας την είσοδο έτσι ώστε κάποια στιγμή να ταιριάξει με τη βασική περίπτωση.
Οι αναδρομικές συναρτήσεις ορίζονται όπως οι κανονικές συναρτήσεις, αλλά με τον τροποποιητή rec. Χωρίς αυτόν τον τροποποιητή, μια συνάρτηση δεν θα μπορεί να καλέσει τον εαυτό της και κάθε απόπειρα να το κάνει θα καταλήξει σε σφάλμα μεταγλώττισης. Η αναδρομή, επομένως, πρέπει να δηλώνεται ρητά.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
Η F# υποστηρίζει επίσης αναδρομικούς τύπους μέσω τύπων διάκριτης ένωσης. Ένας αναδρομικός τύπος διάκριτης ένωσης έχει μία ή περισσότερες από τις περιπτώσεις του να αναφέρονται στα δεδομένα τους στον ίδιο τον τύπο διάκριτης ένωσης. Όπως οι αναδρομικές συναρτήσεις, έτσι και οι αναδρομικοί τύποι πρέπει να έχουν μια βασική περίπτωση. Σε αντίθεση με τις αναδρομικές συναρτήσεις, οι αναδρομικοί τύποι δεν χρησιμοποιούν τη λέξη-κλειδί rec.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
Σε αυτή την άσκηση δουλεύεις σε ένα μαγαζί με πίτσες που κάνει παράδοση σε πελάτες.
Προσφέρεις τρεις τύπους πίτσας:
Οι πελάτες μπορούν επίσης να διαλέξουν δύο επιπλέον επιλογές με μια μικρή επιπλέον χρέωση:
Όταν οι πελάτες κάνουν παραγγελία, προστίθεται μια επιπλέον χρέωση αν παραγγείλουν μόνο μία ή δύο πίτσες:
Έχεις τρεις εργασίες, καθεμία από τις οποίες θα δουλέψει με πίτσες και την τιμή τους.
Όρισε τη διακριτή ένωση Pizza ώστε να αναπαριστά τους τύπους πίτσας και τις δύο επιπλέον επιλογές που μπορούν να προστεθούν σε μια πίτσα:
MargheritaCapreseFormaggioExtraSauceExtraToppingsΥλοποίησε τη συνάρτηση pizzaPrice για να υπολογίζει την τιμή μιας πίτσας:
pizzaPrice Caprese
// => 9
Υλοποίησε τη συνάρτηση orderPrice για να υπολογίζει την τιμή μιας παραγγελίας:
orderPrice [Margherita; Formaggio]
// => 19
Γράψου στο Exercism για να μάθεις και να κατακτήσεις F# με 18 έννοιες148 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.