學習軌道
/
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

說明

在這項練習中,你會在一間提供外送服務的披薩店工作。

店裡提供 3 種披薩:

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

顧客也可以支付少許額外費用,選擇 2 個額外選項:

  1. 額外醬料:$1
  2. 額外配料:$2

當顧客下訂單時,如果他們只訂 1 或 2 個披薩,就會加收額外費用:

  • 1 個披薩:$3
  • 2 個披薩:$2

你有 3 個任務,每個任務都會處理披薩和價格。

1. 定義披薩類型和選項

定義Pizza差別聯合,以代表披薩類型以及可以加到披薩上的 2 個額外選項:

  • Margherita
  • Caprese
  • Formaggio
  • ExtraSauce
  • ExtraToppings

2. 計算披薩的價格

實作pizzaPrice函式來計算披薩的價格:

pizzaPrice Caprese
// => 9

3. 計算訂單的價格

實作orderPrice函式來計算披薩訂單的價格:

orderPrice [Margherita; Formaggio]
// => 19
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
F# Exercism

準備好開始 披薩定價 了嗎?

註冊 Exercism,透過 18 個概念148 個練習 和真人引導來學習並精通 F#,全部免費。