与えられた木から、子→親への対応を作る

(define (make-alist tree)
  (let ((parent (car tree))
	(children (cdr tree)))
    (if (null? children)
	'()
	(apply append
	       (map (lambda (x)
		      (cons (cons (car x) parent) (make-alist x)))
		    children)))))

やってみたらすげー素人くさくなってしまった
30分以上かかっちゃうし><
テラ初心者以下


【追記】
wilikiの解答を見たらnaoya_tさんのfoo2に近かった。apply appendが汚いと思ってたけど、この形で書こうとすると必然的にそうなるのか。勉強になるなあ


自分レベルの初心者はかえって貴重かもしれないので、迷走の過程をまとめてみる

  • 最初、何も考えずにcdrで再帰を回そうとする
  • 反省して少し考える。childrenにmapで再帰しなきゃいけないことに気付く
  • 内部defineで一時変数に結果を取っておこうとして、一つあとのタイミングでconsしてしまい、(Spine . Root)が三つできてしまう
  • 内部defineを廃止して素直にリストを返すようにする
  • だいたい結果が出るようになるが、かっこだらけで泣きそうになる
  • mapの結果がリストのリストになってるのが原因なので、しかたなくアドホックにapply appendでかっこを取る