見出し画像

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

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

問題22.

 Z上の閉区間に含まれる全ての整数からなるリストを生成する関数rangeを書け。

※ 例えば、range 3 5は ["3"; "4"; "5"]になります。

答案

本問の解き方

 本問の関数rangeが生成するリストを閉区間リストと呼ぶことにします。
 この閉区間リストを再帰的に定義すると、
 1) 一つの整数からなるリスト[a]は閉区間リストである
 2) 閉区間リスト[a; a+1; …; a+n]に対し、a-1を先頭に加えたリスト[a-1; a; a+1; …; a+n]はまた閉区間リストである
 3) 閉区間リスト[a; a+1; …; a+n]に対し、a+n+1を末尾に加えたリスト[a; a+1; …; a+n; a+n+1]はまた閉区間リストである
 になります。

 2)と3)は整数を昇順で数えるか、降順で数えるかの違いによります。本答案では、昇順で数えることにします。
 具体的には、再帰呼び出しのときに最小値側の引数を1づつ加算するとともに、その返り値と最小値とを::演算子で結合します。

 1)は空リストでもよいのですが、本答案では単リストにしました。
 したがって、停止条件は最小値と最大値とが一致するときであり、そのときの返り値は最大値(最小値)を要素をする単リストになります。

コード

OCaml

let rec range saishou saidai =
 if saishou < saidai then saishou::range (saishou+1) saidai else [saidai]

感想

OCaml

 今回は、何となくコードを書いたら何となく上手くいました。それだけに、解き方を説明するのが大変でした。

言語化
 そう言えば、この「言葉で説明する」を最近は「言語化」などと言いますが、非常に気持ち悪く感じるのは私だけでしょうか。

 「言語」とは、所謂アルファベットと規則からなる大掛かりなものではないでしょうか。
 単に「口頭で説明する」や「言葉で表す」程度のことに「言語」を持ち出すのは、「言語」を軽んじているようで、違和感を通り越し嫌悪感さえ憶えます。

 ですがこの「言語化」にも良い側面があります。
 それは、文章に「言語化」が登場すると
 ・著者は単語の選択に注意を払っていない
 ・曖昧な語句に言い換えるということは、何かを伝えるための文ではなく、体裁を取り繕うための文字の羅列でしかない
 ことがわかります。
 つまり「私にとっては」読む価値のないゴミであると教えてくれます。

 次回は、第23問です。見出しにカフェオレの写真を使いたいのですが、よいものがありません。皆さんオシャレな木机の上に置いて撮影をされるので、見出しにすると、茶色だらけのメリハリのない画像になってしまいます。

いいなと思ったら応援しよう!

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