Треки
/
F#
F#
/
Вправи
/
Ціни на піцу
Ціни на піцу

Ціни на піцу

Навчальна вправа

Вступ

Рекурсія

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

Вказівки

У цій вправі ми працюємо в піцерії, яка доставляє замовлення клієнтам.

Пропонуємо три види піци:

  • Margherita: $7
  • Caprese: $9
  • Formaggio: $10

Клієнти також можуть обрати дві додаткові опції за невелику доплату:

  1. Додатковий соус: $1
  2. Додаткові топінги: $2

Коли клієнти роблять замовлення, додається додаткова плата, якщо вони замовляють лише одну або дві піци:

  • 1 піца: $3
  • 2 піци: $2

На нас чекають три завдання, кожне з яких стосується піц та їхньої ціни.

1. Визначте типи піци та опції

Визначте дискриміноване обʼєднання Pizza, щоб представити типи піци та дві додаткові опції, які можна додати до піци:

  • Margherita
  • Caprese
  • Formaggio
  • ExtraSauce
  • ExtraToppings

2. Обчисліть ціну піци

Реалізуйте функцію pizzaPrice, щоб обчислити ціну піци:

pizzaPrice Caprese
// => 9

3. Обчисліть ціну замовлення

Реалізуйте функцію orderPrice, щоб обчислити ціну замовлення піци:

orderPrice [Margherita; Formaggio]
// => 19
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
F# Exercism

Час розпочати Ціни на піцу?

Зареєструйтеся на Exercism, щоб вивчати й опановувати F#, а також 18 концепцій148 вправ та справжнє наставництво від людей, і все це безкоштовно.