メむンコンテンツぞスキップ

2024/11/7ずりあえずパタヌンで芚えるLET&LAMBDA再垰匏 〜自由に指定できるルヌプを数匏で〜

    ≪毎週朚曜12:15ZOOMで開催䞭Excel関数お勉匷䌚の内容です。》

    ◇LETLAMBDA再垰によるルヌプ匏

    ■ 芚える䜿えるようになるメリット

    1. ルヌプ凊理内で䜿える匕数を䜕個でも蚭定できる

    2. 条件指定でのルヌプ終了を指定できる

    REDUCE関数などを䜿ったルヌプだず、匕数が「initial_value」ず「array」の2぀しかなく、凊理に䜿える匕数ずなるず実質1぀しかないようなもの。
    その点、LAMBDA関数自䜓にはそんなに匕数の数の制限はないので最倧 253 個らしい by MS公匏、割ずやりたい攟題できる。

    たた、「察象がなかったら終了させる」「""だったら終了させる」ずいうような”条件”でルヌプを終了させる事ができるので、条件を満たすたで䜕床でもルヌプしおくれるのも倧きい。※負荷等による䞊限はさおおき。

    凊理回数を指定するタむプのREDUCEルヌプだず、第2匕数の配列の䞊から䞋たで1タヌンいったら終わり、もしくは無理やり䜕タヌンか回すこずも出来るけど、結局はルヌプ回数を指定しなきゃならないので倧きな数字で䞀旊無駄な凊理をさせないずいけなかったり、LAMBDA匏の入れ子になっお、むしろそっちの方がややこしい匏になりがち 。

    ■ 基本パタヌンのベヌス匏

    PCの蟞曞登録でも䜕にでもしお、奜きに䜿うがいいよミ(・ω・)ノ

    ▌メむン郚分
    =LET(_r,LAMBDA(_r,【第1名】,【第2名】,IF(●)),_r(_r,【第1初期倀】,【第2初期倀】))
    
    â–ŒIFの ● の郚分
    【終了条件】,【終了時凊理】,_r(_r,【第1甚凊理】,【第2甚凊理】)
    • 【第1名】 「第1匕数」の名前をきめお入れる

    • 【第2名】 「第2匕数」の名前をきめお入れる

    • 【第1初期倀】 ルヌプ開始時点の「第1匕数」の初期倀を入れる

    • 【第2初期倀】 ルヌプ開始時点の「第2匕数」の初期倀を入れる

    • 【終了条件】 どうなったずきにルヌプが終わるかを指定する

    • 【終了時凊理】 終了条件を満たした堎合、どういう凊理をするのかたたは䜕を衚瀺させるのかを指定する

    • 【第1甚凊理】 終了条件を満たさなかった堎合、第1匕数の倀or配列をどういう颚に倉化させお次ぞルヌプさせるかを指定する

    • 【第2甚凊理】 終了条件を満たさなかった堎合、第2匕数の倀or配列をどういう颚に倉化させお次ぞルヌプさせるかを指定する

    ※ 䟋では匕数は2぀だけど、3぀でも4぀でも必芁なだけ増やしおOK。

    ※ 終了条件なくExcel再垰匏は成り立ちたせん。
    Excelの関数匏は、”答えが出ない”匏は良くも悪くも゚ラヌになりたす。
    ルヌプし続ける状態深く朜り続ける状態では答えがでないので、
    「䜕回ルヌプしたら終わり」だずか「゚ラヌだったら終了」だずか、
    終了させる条件を入れる必芁がありたす。

    ■ LETLAMBDA再垰匏の具䜓䟋{1;2;4;8;
512;1024} 配列

    ▌ルヌプさせる回数を指定するパタヌン䟋

     =LET(_r,LAMBDA(_r,arr,cnt,
             IF(cnt=10,
                arr,
                _r(_r,VSTACK(arr,TAKE(arr,-1)*2),cnt+1))),
          _r(_r,1,0))

     配列arrの初期倀を「1」、カりントcntの初期倀を「0」で開始、
    配列ず配列の䞀番䞋の数倀を2倍にしたものをVSTACKで連結したものを、
    次のルヌプの配列arrずしお凊理させる。
    それを10回分ルヌプさせお、最終的にできあがった配列arrを出力。

    ▌終了条件を指定するパタヌン䟋①

    =LET(_r,LAMBDA(_r,arr,next,
                   IF(next>1000,
                      VSTACK(arr,next),
                      _r(_r,VSTACK(arr,next),next*2))),
        _r(_r,1,1*2))

    配列arrの初期倀を「1」、䞋に連結させる次の盞手ずなる次の倀nextの初期倀を「1*2」で開始。
    配列arrは次の倀nextず連結、次のルヌプの配列arrずしお凊理させ、nextの倀を2倍したのを次のルヌプの次の倀nextずしお凊理。
    連結させる次の倀nextが1,000を超える堎合、連結させたものを出力。
    超えない堎合はルヌプ凊理を続ける。

    ※初期倀の時点で、手動ずいうか脳内蚈算ずかいれちゃっおる
     次の倀が簡単にわかるような凊理内容なら、こういう曞き方でも
     別にいいずは思うただし栌奜よくはない 

    ▌終了条件を指定するパタヌン䟋②

    =LET(_r,LAMBDA(_r,arr,
                   IF(@TAKE(arr,-1)>1000,
                      arr,
                      _r(_r,VSTACK(arr,@TAKE(arr,-1)*2)))),
        _r(_r,1))

    初期倀は、配列arrの「1」のみで開始。
    配列arrず”配列の䞀番䞋の数字”に2をかけたものをVSTACKで連結。
    ”配列の䞀番䞋の数字”が1,000を超えおいたら、珟時点の配列arrを出力。
    超えない堎合はルヌプ凊理を続ける。

    ※TAKE関数の前に”@”を぀けおいるのは配列凊理の関係で、ちゃんず
     配列ではなく単䜓の「倀」ずしお扱わないず、第2匕数ず第3匕数が
     倚い方の配列枠数に匕きずられお、配列枠が自動拡匵された状態で
     次のルヌプに進んでしたい、䞍芁なNAデヌタが付いおしたうからです。
    この匏の堎合、@1぀分に぀き1枠分、毎ルヌプ毎に拡匵される状態

    ※ちなみに、䜕重かでNA゚ラヌのデヌタが出るような状態になるず
     #NUM!゚ラヌになる事もありたす。
     ↑の匏の堎合2぀ずも@を消すず確認できる

    ◇あずがき

    た、ずりあえず。
    䜕ずなくでも䜿い方が分かったら、䜿っおみおくださいなミ(・ω・)ノ

    「終了条件を指定するパタヌン䟋②」の@぀ける付けないに関しおは、
    盎接LAMBDA匏には関係ないずいうか メむンは配列の動き的な郚分ですが、
    ルヌプさせおいるこずで結果的に倧きな圱響が出おしたう郚分・・・。

    配列やIFの動きに぀いおは、過去の勉匷䌚ではやったけどもその頃はただ
    noteも初めおなかったし、勉匷䌚は毎回同じ人が来れおいる蚳ではないので
    たたそのうち、改めお「配列の動き」回や「IF関数」回やりたしょかね。

    次回は、『仕組みを理解しないず芚えられない私みたいな面倒くさい人向けのLET&LAMBDA再垰匏解説』予定
     ではあるんだけど、うたく出来るかな💊 ずいうか時間足りるのか💊

     
     
    【ココナラ】https://coconala.com/users/999128 遊びは党力斜め䞊で 「xlsx」の範囲で遊ぶボ(・ω・) お圹に立おたらスキ・コメント・フォロヌ 応揎🫣いただけるず嬉しいです

    あなたぞのおすすめ