ソートのプログラミングを教えていると、「クイックソート」で苦労する学生が多いようです。自分も苦労しました。
再帰という考え方が、階乗やフィボナッチ数列よりも複雑なものになると、少なくとも自分は、とたんに理解に苦労してしまいます。
何か「再帰」には、人類の思考法とは本質的に相性が悪いといった、特別な理由があるのでしたら教えてください。
愚痴をブログで書いたので、回答としては簡潔にまとめるように努力しますが、
・そもそもクイックソートが難しい(分岐条件が理解しづらい)
・扱うデータが多いからめんどい(挫折する
・一直線な(徐々に狭まっていく)再帰ではない
のが原因なのかなーと思います。
なぜ? については上述の理由で。
【人類の思考法とは本質的に相性が悪い】
については、本質的ではないだろうが、キャパを超えやすいという理由があるんだろうと思います。
今、適当に検索したら、再帰処理ってループでも書けるという言説を読んだのですが、ループだと終了条件がわかりやすい、ループ毎の変化が直感的に捉えられる、分岐などしない(してもなんとなく理解しやすそう)というメリットがあるのに比べ、再帰だと、その辺りがもやーんとするんだろうなーって思いました。
次のループに入る時の状態と、次の再帰に入る時の状態を考えると、ループの方がなんとなく理解しやすいだろう(だからループで書けるならループで書く)。
そもそも再帰を利用すべきケースって結構限られているのかも知れないですね。
ソースは洗練されたふうに見えますが、可読性はかなり落ちますし。
長くなりました。
自分も、再帰では苦労してきた口の人間です。再帰を使うときは、「再帰脳」とでも言うような特別な状態にならなければならないと感じます。(得意な人もいるので、人間一般の脳とは関係ないかも)自分がやる時は、ここを読み返して、「再帰脳」になってから始めます。
http://ylb.jp/2007b/proc/recursion/
プログラマの数学、の再帰の6章
https://www.amazon.co.jp/exec/obidos/ASIN/4797395451/hyuki-22/
再帰の代表例として、フラクタル図形があります。あれ、なんだか怖くありません?
際限なく小さい構造が、さらに小さい構造で覆い尽くされていく。自分の立ち位置が侵されて、さらに小さな領域へと連れて行かれる。その”際限なく続く手続き”が怖いのではないかと。
存在するれ
「私、今回で何回目の呼び出しなの?」
「もう、わからないんだけど」
「え、戻れるの私たち」
「一応そのはずなんだけど」
「ボクはもう一つ先に行くね」
たしかにフラクタル図形は、もやっとする気持ち悪さを感じます。
あと、入れ子構造が、人間にはあまり向いていないような気もします。