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=1」「a=2」を当てはめるとこうなります。
答えは、そりゃ「3」になりますよね。
ここまでは大丈夫でしょうか・・・?
■再帰する「LET&LAMBDA式」の場合
次は、再帰するLET&LAMBDA式も同じように図にしてみます。
後半の『r(r,a*2)』の部分はともかく、全体としては単純なIF式である事が
分かりやすくなったんじゃないかな?と思います。
これに、引数「r=R」「a=1」を当てはめるとこうなります。
1は10より大きくないので、TRUEの「1」ではなく、
FALSEの「R(R,1*2)」の掛け算部分を計算して・・・
次の段階の処理としては、『R(R,2)』を実行することになります。
この「R(R,●)」の形。さっきと一緒ですね('-'*)
んじゃ、また同じように図に入れてしまいましょう。
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関連には一区切りさせて、次回からはもっとなんか
一般的(?)な回にしようかなーと考えています。
来週なにしようかなー?
何かリクエストやお題があれば、気軽に投げてくださいね(*´∀`*)
それでは、今週もありがとうございましたー!
この記事が気に入ったらサポートをしてみませんか?