トップページへ

リストの全要素に一律の処理を実行する関数--再帰呼び出し関数の基本形--

Access Count : 1797

Copyright © 2020 TAKEHANA TADASHI
著作日時: 2020.07.22.水. 21:30:00 著作者、竹花 忠
リストの全要素に一律の処理を実行する関数--再帰呼び出し関数の基本形--
kansuh [] = []
kansuh (x:xs) = (shori x) : kansuh xs
という定義がある。shoriについては、別途なんらかの処理が定義されているものとする。そしてここでは、その処理の内容については立ち入らないことに、気にしないことにする。
 上記の2行の定義によって実現される処理は、一足飛びに飛躍して結論を述べれば、次のようなことである。
 kansuhの引数にわたされたリストの全要素に対してshoriを実行した結果が、kansuhの引数にリスト渡しての関数kansuh呼び出しの結果である。
 たとえば、kansuh [1,2,3]を呼び出したなら、[(shori 1), (shori 2), (shori 3)]がその結果となる。
 上記の2行を定義とする関数であるなら必ずそうなる。
 なお、飛躍なく順に変遷展開を辿ると次のようになる。
 kansuhにわたされたリストが空リストなら空リストを返す。
 もし、kansuhに空リスト以外のリストがわたされたなら、そのリストを先頭要素と後続のリストに分けて受け取る。その時には、先頭のよそにはshoriを実行し、後続のリストにはkansuhを再度実行する。そしてこの2つを、リスト構築子で連結する。つまり、(shori x) : kansuh xsとする。
 ここでリスト構築子の右辺は、関数呼び出しになっている。関数呼び出しの記述は常に、その定義の記述に置き換える。したがって、kansuh xsは、xsが[]なら[]に置き換える。するともう関数呼び出しが存在しなくなっているので、もうこれ以上の置き換えは行われない。しかし、kansuh xsのxsが[]でなかった時には、kansuh (x:xs) = (shori x) : kansuh xsへと進む。
 つまり、kansuh xsを、kansuh (x:xs)で受け取る。kansuh xsのxsが新たにその先頭要素xと新たに後続リストxsに分けられる。そして、その新たなxとxsによる(shori x) : kansuh xsに置き換える。
 この置き換えで生じた、新たなkansuh xsが、kansuh []になるまで、その時その時の新たなxとxs、による(shori x) : kansuh xsに、kansuh xsの部分を置き換え続けてゆく。
 従って、kansuh リスト、の形式の呼び出しの記述は、
(shori x) : (shori x) : ・・・ : (shori x) : []の形式に置き換わる。
 ここで一番左の(shori x)のxは、最初にkansuhに渡されたリストの先頭要素で、左から2番目の(shori x)のxは、最初にkansuhに渡されたリストの2番目の要素で、・・・そして、、末尾の(shori x)のxは、最初にkansuhに渡されたリストの末尾の要素である(ことに注意)。
 それが右端の空リストに対して、その左の要素から順にさらにその左要素さらにその左の要素と、追加されてゆく。
 つまり、kansuh [1,2,3,4]で関数呼び出ししたなら、
(shori 1) : (shori 2) : (shori 3) : (shori 4) : []となり、そして、
(shori 1) : (shori 2) : (shori 3) : [(shori 4)]となり、そして、
(shori 1) : (shori 2) : [(shori 3) , (shori 4)]となり、そして、
(shori 1) : [(shori 2) , (shori 3) , (shori 4)]となり、そして、
[(shori 1) , (shori 2) , (shori 3) , (shori 4)]となる。

 kansuh [2,4,6,8,10]で関数呼び出ししたなら、
(shori 2) : (shori 4) : (shori 6) : (shori 8) : (shori 10) : []となる。
 そして同様にして、[(shori 2), (shori 4), (shori 6), (shori 8), (shori 10)]となる。

 最初にkansuhに渡されたリストの全要素に、shoriが実行された結果が、リストを引数にしてkansuhを呼び出した時の結果になる。
 kansuh [1,3,5]での呼び出しの結果は、[(shori 1), (shori 3), (shori 5)]である。
kansuh [] = []
kansuh (x:xs) = (shori x) : kansuh xs
という2行がkansuhの定義であった場合には。

 上記のプログラムが動作するものとするためには、たとえば、shoriを、(*10)としたりすればいい。
 そうすれば、kansuh [2,3,5,7,11,13]の呼び出しは、[20, 30, 50, 70, 110, 130]という結果をもたらすことになる。