見出し画像

関数型プログラミングの初級問題-15問目- (約1分)

 関数型プログラミングによるリスト操作の練習問題の15問目です。問題は、OCaml公式ページのものを使いました。
 内容は、問題と答案です。答案の作成時間は、約1分でした。

問題15.

 リストの各要素を要素毎に繰り返し回数だけ繰り返してなるリストを生成する関数replicateを書け。

※ 例えば、["a"; "b"; "c"] 2が["a"; "a"; "b"; "b"; "c"; "c"]になります。

答案

基本的な考え方

 関数型プログラミングによるリスト操作の基本的な流れは、以下の1から3になります。
  1. 引数のリストをheadとtailに分離する
  2. tailを引数として再帰呼び出すると共に、その返り値とheadを適当に組み合わせる
  3. 以上を引数のリストが停止条件に達するまで繰り返す

本問の解き方

 所定の要素を複数回繰り返してリストを生成する関数は、ランレングス復号のときに作成しました。
 この関数にheadを渡したときの返り値と、tailを引数とした再帰呼び出しの返り値とを@演算子で結合します。

コード

let rec replicate =
let rec repeat = fun youso kaisuu -> if kaisuu < 1 then [] else youso::repeat youso (kaisuu-1) in
fun lisuto kaisuu -> match lisuto with
| [] -> []
| head::tail -> repeat head kaisuu@replicate tail kaisuu


感想

 今回の問題は、第12問の一部です。つまり、第12問の答案を作成したときに、既に解いているはずの問題です。
 なぜこのような出題の順番なのか?
 それは、例によってOCamlの執筆者が「僕が作った最強にエレガントな解答方法」をどうしても披露したくて、オリジナルから出題の順番を変更したためでしょう。

 虚栄心を抑えられないなんてまるで中学生ですね。若い気持ちを忘れず素敵です。

 次回は、第15問です。

おまけ

なぜnoteには読める記事が少ないのか

 記事の字数が少ないので埋め草がわりに、noteの記事を読む気になれない「個人的な」理由を挙げてみました。

・おすすめが優秀すぎて怖い
 第五福竜丸についての書籍を買ったら、店員が「これもどうですか?」とグラビア写真集を推めてくる、アホか。

・検索がGoogleを超えている
 プログラムで検索すると新着記事はギャンブル予想一色、郷土料理で検索しても料理の記事はせいぜい半分、夏休みの自由研究なみのアルゴリズム。

・魅力的な文章が多い
 伝えたいこともないのに、無理に書いているような記事が多い。
 作文技術が高い場合には、最後まで読むものの内容が全くないことにうんざりし、低い場合には、幼児のおしゃべりが如きダラダラとして文章にうんざりする。
 著者自身がつけたタイトルについての論述試験として記事を観た場合に加点箇所があまりにも少ないのではないか。

・生理的に受け付けないイラストがある
 クセが強くて気持ちが悪い。

古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。