2024/11/14:仕組みを理解しないと使えない人向けLET&LAMBDA再帰式解説

≪毎週木曜12:15~ZOOMで開催中!Excel関数お勉強会の内容です。》


◇ 解説するLET&LAMBDA再帰式について

今回は、仕組みを理解しないと覚えられない・使えない、私みたいな面倒くさい人向けのLET&LAMBDA再帰式解説回です。
(把握したら強いが、腹落ちしてない方程式とか覚えられない残念人間…)

尚、「再帰式」と書いてはいますが、❝実行させると再帰する処理を行えるようになる式❞という訳ではなく、❝LAMBDA関数を再帰させることで「ループ」させる処理を行えるようになる式❞となります。

尚、今回は再帰式として有名らしい(?)Zコンビネータとかではなく、
前回の勉強会でも紹介したシンプルな式の説明です。

▼前回の内容
2024/11/7:とりあえずパターンで覚えるLET&LAMBDA再帰式 〜自由に指定できるループを数式で〜|華月(かづき)

今回はとりあえず比較的単純な、以下の式をメインに解説してきます。
(引数の「1」を2倍する式をループ、10を超えたら出力⇒結果は「16」)

=LET(R, LAMBDA(r,a, IF(a>10, a, r(r, a*2))), R(R, 1))
=16

ちなみにLET関数を使わず、LAMBDAだけの式へ展開することもできるのです(↓こうなります)…が、今回の説明方法的にLET関数でまとめた状態の方が腹落ちしやすいと思うので、LET&LAMBDA式のほうで説明します。

 =LAMBDA(r,a, IF(a>10, a, r(r, a*2)))(LAMBDA(r,a, IF(a>10, a, r(r, a*2))),1)

◇ なぜ式の中で再帰できるのかを把握する

➊LET関数内にLAMBDAで作った式を名前を付けて登録できる。

例)引数「a」を1.1倍する式に「税込」という名前を付けてから、
  「税込」関数を使う事ができる。

=LET(税込,LAMBDA(a,a*1.1),税込(100))
=110

➋名前登録した式はそのLET関数式内であれば何度でも使える。

例)数字の10に「数字」という変数名を付けて、
  その後の計算で「数字」という変数名を複数回(↓では3回)使って式を書く事ができる。

=LET(数字,10,数字+数字*数字)
=110

➌LAMBDA式にLAMBDA式をネスト(入れ子)する事ができる。


例1)引数を書く後ろのカッコ ( ) も一緒にネストするパターン
=LAMBDA(a,LAMBDA(b,a+b)(4))(2)
=6

例2)引数を書く後ろのカッコ ( ) は両方とも外に出すパターン
=LAMBDA(a,LAMBDA(b,a+b))(2)(4)
=6

➍LAMBDA内の変数はそのLAMBDA内で何度でも使える。


例)引数として3をいれた変数「a」を複数回(↓でh3回)使って式を書くことができる。
=LAMBDA(a,a+a*a)(3)

【結果】組合せると、こういう事が可能になる!

◇【重要】実際の処理部分がどこかを意識する

実際に処理している部分は、最後の部分!

何だそんな事。左側はあくまで名前をつけて登録しているだけなんだから、
右の部分が、実際に処理している部分なのはあたりまえじゃないか!
・・・と思われるかもしれないけれど、地味にこれが重要な気がします。

左に元となる式が見えていると、右側の引数をそのまま左側に入れるイメージで考えてしまう。そうすると、「あれ?次のループに入ったとして、その時の引数はどこから持ってくることになるの?」・・・みたいな罠に陥りがち💦

◇シンプルな図のイメージで把握する

そもそも、LET関数とLAMBDA関数を組み合わせていると、LET関数は名前を先につけて後ろで使うわ、LAMBDA関数は、引数として使う部分の変数名は前でつけるものの、使うのは真ん中あたりだし、実際に引っ張ってくる引数は後ろだし・・・なので、どの値がどこに入ってどこで使われているのかが、複雑な式になるほどややこしくなる。

なので、LAMBDA式をシンプルな図としてイメージしてみました(*´∀`*)

■再帰しないシンプルな「LET&LAMBDA式」の場合

まずは、再帰しないシンプルなLET&LAMBDA式を、計算カードのような
図のイメージとして変換してみます。

単純に「r+a」なだけ。

処理内容は、実質「r+a」というだけの単純な式である事が、
分かりやすくなったのではないでしょうか?(自画自賛ごめんなさい!)
これに、引数「r=1」「a=2」を当てはめるとこうなります。

1+2=3

答えは、そりゃ「3」になりますよね。
ここまでは大丈夫でしょうか・・・?

■再帰する「LET&LAMBDA式」の場合

次は、再帰するLET&LAMBDA式も同じように図にしてみます。

単純にIF式と認識できる。

後半の『r(r,a*2)』の部分はともかく、全体としては単純なIF式である事が
分かりやすくなったんじゃないかな?と思います。
これに、引数「r=R」「a=1」を当てはめるとこうなります。

IF(1>10,1,R(R,2))

1は10より大きくないので、TRUEの「1」ではなく、
FALSEの「R(R,1*2)」の掛け算部分を計算して・・・
次の段階の処理としては、『R(R,2)』を実行することになります。

この「R(R,●)」の形。さっきと一緒ですね('-'*)
んじゃ、また同じように図に入れてしまいましょう。

IF(1>10,1,R(R,4))

2は10より大きくないので、TRUEの「2」ではなく、
FALSEの「R(R,2*2)」の掛け算部分を計算して・・・
次の段階の処理としては、『R(R,4)』を実行することになります。
また「R(R,●)」になりましたね。
・・・そうです。
ご想像の通り、この状態がIF式の結果がTRUEになるまで続きます。

結果は、2倍していった数が10を超えた時に、IFの条件式がTRUEになるので
「16」が最終的な結果として確定します。
解説おわりっ!!!

◇あとがき

いかがでしたでしょうか?
なんとなーくでも、なぜ再帰してループ処理ができるようになって
実際にどういう処理がされるかのイメージを掴むことが出来たでしょうか?

ちなみに、私は少し前にTwitter(現X)の相互フォローさんから
「Zコンビネータも楽しいよ^^」と折角お誘いいただいていただいたので、
私は引き続き無い脳みそをこねこねして、今回の式より何段階もややこしい
Zコンビネータも、何とか簡単な理解方法はないか&解説方法はないかと
のんびりチャレンジしてみている所です(`・ω・´)<世界広げたい

今回はかなりマニアック&ニッチな回になってしまいましたが、
ひとまずこれでLAMBDA関連には一区切りさせて、次回からはもっとなんか
一般的(?)な回にしようかなーと考えています。

来週なにしようかなー?
何かリクエストやお題があれば、気軽に投げてくださいね(*´∀`*)
それでは、今週もありがとうございましたー!

この記事が気に入ったらサポートをしてみませんか?