#ハッカーと画家に影響され、html と css の経験しかないのに、land of lisp をみて勉強しているものです。38ページの
#(defun my-length (list)
#(if list
#(1+ (my-length (cdr list)))
#0))
#でこの再帰の、特に3行目の(my-length (cdr list)) のトコロがわかりません。例えば5個のリストが有った場合、まず1を足し、その代わりにcdr でリストの数を1減らし、リストが0になるまでこの動作を続けるということなんだと思うのですが、全体の意味が使めす、自分でこの書き方ができないでいます。よろしければ教えて下さい。
#まずは具体的な引数、例えば(my-length '(a b c d e))を評価したときに何が起きるか、各回の呼び出しと返り値が何になるかを書き下してみてください。動作の記述は「まず1を足し~思うのですが」ということで合っています。それが直感的につかめなくてもやもやしてるんじゃないかなと推測します。
#my-lengthについて具体的な動作は思い浮かぶんだけれど、自分で再帰を使って何かを書こうとすると書き方がわからなくなる、ということなら、練習が一番です。えーっとLoLでどんな例が出てたかな。
#とりあえずmy-lengthが出来たところで先に進んでゆくと、再帰を使うコードは何度も出てくるはずなので、その都度同じように動作を追ってみる、というのが一つの手。
#それでもどうしても腑に落ちない、自分で書けるようにみっちり練習したい、というのなら、『Scheme手習い』という本がおすすめです。
#直感的に理解する時のハードルは、「my-lengthの意味を知りたくて中を読んでるのに、その中で(まだ意味がわからない)my-lengthを呼び出しちゃったら『分からない』が循環しちゃうじゃん」ってところだと思うんですが、
#「中身の詳細は置いといて、my-lengthはリストの長さを返すものだ」と一旦「仮に決めて」から中を見ると、再帰呼び出しのところで「ああ、この中身はともかく、こいつはリストの長さを返すんだったな」となって循環が止まります。ちょっとしたコツです。
#「部分を全部理解する前に全体に対して仮定を置き、それから細かく見てゆく」と言ったらいいかな。