トップページへ

Haskell言語における再帰呼び出し関数の基本形

Access Count : 1393

Copyright © 2021 TAKEHANA TADASHI
著作日時: 2021.04.10.土. 16:01:00   著作者、竹花 忠
Haskell言語における再帰呼び出し関数の基本形:
 先頭から一部分を処理してはその部分を千切り捨て、その残余のデーターでまた処理を実行させ、その先頭からの一部分を処理してはその部分を千切り捨て、そしてまた、その残余のデーターで処理を実行させ、・・・
 やがてデーターが尽きたら、その時には、返り値を完成させるように、これまでの処理結果をまとめ上げる。
 以上にて、返り値が完成して、再帰呼び出し関数の処理が終了する。
 これが、再帰呼び出し関数で行うことである。
 上記の、『残余のデーターで処理を実行させ』というのが再帰呼び出し、の記述部分である。
 『やがてデーターが尽きたら、その時には、返り値を完成させるように、これまでの処理結果をまとめ上げる』というのが、空リストで再帰呼び出しを行った場合の記述部分である。この再帰呼び出しが停止する定義の記述部分を、再帰呼び出し関数の基底部の記述、と言ったりする。
例1、
kansuh :: [Int] -> [Int]
kansuh [] = []
kansuh (x:xs) = (x * 15) : kanush xs

 例1では、引数で渡されたリストの全要素が15倍の値になったリストが得られる。
 つまり、kaerichi = kansuh [1, 2, 3]、によって、kaerichiに、[15, 30, 45]が得られる。
 ちなみに、:は、リスト構築子である。
 再帰呼び出しが繰り返されて基底部の呼び出しに達し、15 : 30 : 45 : [] に至り、[15, 30, 45]がもたらされる。

例2、
kansuu :: [Int] -> Int -> Int
kansuu [] acc = acc
kansuu (x:xs) acc = kansuu xs (acc + x * 10)

 例2では、引数でわたされたリストの全要素を10倍した和が得られる。
 つまり、kaeriti = kansuu [1, 2, 3] 0、によって、kaeritiに、60が得られる。
 この例では、kansuu [] acc、の形式での関数呼び出しの時のaccの値が60である。その呼び出しの時、返り値をaccにせよ、という定義なので、60が最終的な返り値となる。なので60がもたらされる。

 上記の2つの例は、いずれも、リストの先頭の1要素だけを処理しては、その1要素を千切り捨てて、残余のリストでまた処理を実行させることを、再帰呼び出しによって次々に連鎖実行して、やがて基底部の呼び出しに至る。それによって再帰呼び出しの連鎖が終結し、返り値が確定して、再帰呼び出し関数が終了している。
 これが、再帰呼び出し関数の基本形である。