イバコの生存記録

いまは競プロ(AtCoder)記事がメインです。

47. ラムダ式の再帰を書きたかった話

仕事でコードを書いていて、ふとラムダ式再帰処理を書きたくなりました。
privateメソッドやローカル関数で定義すれば良いと言えばそうなのですが、その場限りの微妙に複雑な処理なので変数にバインドしたかった感じです。

通常のメソッドでは以下のように再帰を書きます。

int Factorial(int n) {
    return n == 0
        ? 1
        : n * Factorial(n - 1);
}

当然ですが、このようにメソッド名が必要になります。よって、ラムダ式再帰を書くのは一見無理そうです。

しかし、C# では以下のように書くとラムダ式再帰を実現できるようです。

void Hoge() {
    Func<int, int> f = null;
    f = n => n == 0 ? 1 : n * f(n - 1);
}

ちなみに、f の宣言と定義を同時に行うと、ラムダ式内での f を解決できずにコンパイルエラーとなります。

これでコンパイルは通りますし実行結果も期待したものになりますが、なんだか気持ち悪いなー、という感想です。
もし、「実行しているメソッド自身を表すキーワード」があればスマートな記述ができそうです。C# 的には拡張メソッドみたいに this を使ったものが自然でしょうか。

そんなことを考えていると、次期 C++C++2b / C++23)にはこの記法を補助する文法が追加されるという情報を得ました。

yohhoy.hatenadiary.jp

C++ ではラムダ式の第1引数で this を置くことでラムダ式自身を受け取れるようになるみたいです。
ということは、そのうち C# にも追加されそうだなー、と思いました。