Здатність чогось визначатися через самого себе називається рекурсією. У 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 вправ та справжнє наставництво від людей, і все це безкоштовно.