學習軌道
/
Common Lisp
Common Lisp
/
練習
/
羅根的數字分割
羅根的數字分割

羅根的數字分割

學習練習

簡介

縮減

縮減是指對序列中的每個元素重複套用一個函式,並以某種方式累積結果。 所套用的函式接受兩個參數:目前的累積值,以及要處理的項目。 它的求值結果必須是新的累積值。

在 Common Lisp 中,這個過程是透過reduce函式完成的。 最簡單的形式如下:

(reduce #'function-to-apply sequence :initial-value value)

請注意,這裡提供了初始值,這會是處理第一個元素時傳入函式的「目前的累積值」。

以下範例會將陣列中的數字相加,並從初始值 10 開始:

(reduce #'+ '(1 2 3 4) :initial-value 10) ; => 20

請注意,如果序列是空的,函式永遠不會被呼叫,而這個形式會求值為 initial-value。

說明

Lisp 外星人 Logan 喜歡數字,也喜歡整理歸類。

他們想請你幫忙寫一個函式,這個函式會接收一串數字,並產生一對陣列:第一個包含所有奇數,第二個包含所有偶數。

1. 將數字分類

首先,你需要建立一個函式,接收兩個陣列組成的一對和一個數字,並根據這個數字是奇數還是偶數,將它放進正確的子陣列中:

(categorize-number '((1) . (2)) 23) ; => ((23 1) . (2))
(categorize-number '((1) . (2)) 42) ; => ((1) . (42 2))

2. 將大量數字分類

現在,利用你剛才建立的函式,你可以再寫一個函式,接收一串數字,並像上面那樣將它們分類:

(partition-numbers '(1 2 3 4))     ; => ((3 1) . (4 2))
(partition-numbers '(42 31 24 13)) ; => ((13 31) . (24 42))
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Common Lisp Exercism

準備好開始 羅根的數字分割 了嗎?

註冊 Exercism,透過 27 個概念92 個練習 和真人引導來學習並精通 Common Lisp,全部免費。