陣列操作

陣列操作

中等

說明

實作基本的陣列操作。

在函式式語言中,length、map和reduce這類陣列操作非常常見。請在不使用現有函式的情況下,實作一系列基本的陣列操作。

要實作的操作,其確切數量和名稱會依 track 而有所不同,以避免與現有名稱衝突,但你會實作的一般操作包括:

  • append(給定兩個陣列,把第二個陣列中的所有項目加到第一個陣列的尾端);
  • concatenate(給定一連串的陣列,把所有陣列中的所有項目合併成一個攤平的陣列);
  • filter(給定一個述詞和一個陣列,回傳所有 predicate(item) 為 True 的項目所組成的陣列);
  • length(給定一個陣列,回傳其中項目的總數);
  • map(給定一個函式和一個陣列,回傳對所有項目套用 function(item) 所得結果的陣列);
  • foldl(給定一個函式、一個陣列和初始累加器,從左側將每個項目摺疊(縮減)進累加器);
  • foldr(給定一個函式、一個陣列和一個初始累加器,從右側將每個項目摺疊(縮減)進累加器);
  • reverse(給定一個陣列,回傳一個包含所有原始項目、但順序相反的陣列)。

請注意,傳遞給摺疊函式(foldl、foldr)的引數順序很重要。

附錄

Note

上述說明是與共用儲存庫同步的,以確保所有語言軌道保持一致。 本附錄會視需要提供額外的說明,或調整這些說明,讓它們更符合 Clojure 軌道的目標。

在 Clojure 軌道的這個練習中,請假設輸入與輸出都是向量,如測試所示。 作為進階目標,你可以想想如何實作一種在中間步驟不使用串列的做法。

請注意,不要重複使用 Clojure 中功能類似的內建函式,這麼做會削弱這個練習原本的學習價值。 clojure.core命名空間中要避免的關鍵函式包括into、concat、cat、lazy-cat、mapcat、flatten、filter、filterv、remove、count、map、mapv、reduce、transduce、reverse和rseq。

選用目標

選用目標是給想額外挑戰自己的人,設計時預設你已經完成主要目標。

試著設計一套做法來通過測試,這套做法要假設:

  • 輸入與輸出都是串列,而不是向量。 請注意,一如往常,測試不需要修改。
  • 中間步驟不能使用向量。

如果你決定發佈這個做法,記得加上註解,說明它對應的是使用串列的選用目標。別忘了更新 docstrings!

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Clojure Exercism

準備好開始 陣列操作 了嗎?

註冊 Exercism,透過 12 個概念105 個練習 和真人引導來學習並精通 Clojure,全部免費。

深入探索 陣列操作!

享受一場實用的遞迴入門,探索陣列操作的指令式與函式風格替代做法,並深入鑽研尾端遞迴與累加器函式。