再帰のセンス


再帰にはセンスが必要だ。

(簡単)入力が偶数であるとき、かつそのときに限りtrueに返す再帰関数isEvenを書いてみましょう。

という問題がPureScriptの教科書にある。この問題を解こうとしたとき、modで2で割った余りを出すという普通の実装なら簡単なのだが、再帰で書くというのがわからなかった。簡単と書いてあるけど全然わからない。

Claude 3.5 Sonnet に聞いたら一発で以下の答えがでてきた。

isEven :: Int -> Boolean
isEven n
    | n < 0     = isEven (-n)
    | n == 0    = true
    | n == 1    = false
    | otherwise = isEven $ n - 2

しかしこれを見てもさっぱり納得できない。理解はできる。しかしこの答えにどうやってたどり着くのか釈然としない。自分の頭が悪いと言われればそれまでだが、多分初見でも再帰関数を書くのが初めてでも、センスがいい人は難なくこの答えにたどり着くのだろう。

再帰を書くのにはセンスが必要だと思う。自分がLispをやってみてもものにならなかったのはこのセンスがなかったからだ。数学的センスというか、プログラミングセンスと言うか。特にエレガントなコードを書くセンスだ。これが文系プログラマの限界なのか。

自分の頭の悪さに絶望するばかりだ。自分にできるのは、毎日シジフォスのように一行でもコードを書くことだけだ。