重畳関数 単語

ジュウジョウカンスウ

1.4千文字の記事

重畳関数とは、高階関数の一種である。関数型プログラミングでよく用いられる。

概要

関数名としてはfold, inject, reduceなどがよく用いられる。プログラミング言語により関数名の違いが大きい。み込みと呼ぶこともあるが、日本語ではみ込みは数学の違う計算exitすことがあるもよう。

初期値と、リストと、「引数を2つとる関数」を引数にとる。「引数を2つとる関数」は正確には「関数自身の戻り値と同じ引数と、リストの1要素を引数とする関数」である。

  1. 初期値とリストの1番の要素に関数を適用する。
  2. 上記の戻り値とリストの2番の要素に関数を適用する。
  3. 上記の戻り値とリストの3番の要素に関数を適用する。
  4. これをリストの最後の要素まで繰り返し、最後に関数を適用した結果を戻り値として返す。

式で書くと以下のような感じである。

fold(ini, list, f): ini は初期値、list は a1, a2, ..., an からなるリスト、f は関数 であるとき、

r1 = f(ini, a1), r2 = f(r1, a2), r3 = f(r2, a3), ..., rn = f(rn-1, an)とするとfold(ini, list, f) = rnである。

的すぎてわかりづらい方のために簡単な例をあげると、「1からnまでの総和をめる関数」を重畳関数で表現することができる。

初期値を0、リストをnまでの自然数からなるリスト[1, 2, ..., n]、関数f(a, b) = a + b とすると、

r1 = f(0, 1) = 0 + 1, r2 = f(r1, 2) = 0 + 1 + 2, r3 = f(r2, 3) = 0 + 1 + 2 + 3, ..., となり、fold(0, [1, 2, ..., n], f)が「1からnまでの総和」になることがわかる。

ちなみに初期値を1、f(a, b) = a × b とすると、n の階乗をめる関数変わりする。

具体例

さらにもう少し具体的に、上記の総和をめる例で n = 5 とすると、

fold(0, [1, 2, 3, 4, 5], +) = (((((0 + 1)+2)+3)+4)+5)

ということであり、これを図示すると、下記のようになる。

初期値 リスト
0 [ 1 , 2 , 3 , 4 , 5 ]
0 + 1
0 + 1 = 1
1 + 2
1 + 2 = 3
3 + 3
3 + 3 = 6
6 + 4
6 + 4 = 10
10 + 5
10 + 5 = 15
15 = fold(0, [1, 2, 3, 4, 5], +)

このように、リストの要素が戻り値の中にみ込まれていく(注入されていく)イメージからfold(あるいはinject)という関数名が用いられたり、複数の値からなるリストが要素数を「減らして」たった一つの値に集約されることからreduceという関数名が用いられると思われる。

逆順の重畳関数

リストの末尾から計算する重畳関数というものもある。fold_rightreducerのように末尾にrightやrをつけて表現することが多い。また、これと区別するために先頭から計算する方をfoldlとかreduce_leftのような表現をすることもある。

上記具体例で言えば、

fold_right(0, [1, 2, 3, 4, 5], +) = (1+(2+(3+(4+(5+0)))))

となる。足し算は交換法則や結合法則が成り立つのでfoldとfold_rightの結果は等しくなるが、関数の種類によっては答えが変わってくる。

関連項目

この記事を編集する

掲示板

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
結月ゆかり[単語]

提供: 試製ガーリバス

もっと見る

急上昇ワード改

最終更新:2025/12/06(土) 15:00

ほめられた記事

最終更新:2025/12/06(土) 15:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP