ありえないScheme

大学に行ってると、パソコンの前に座る時間が少なくなるなぁ、という今日この頃。でも、週に一回大学でもコンピューターの前に座らなくてはいけない授業があります。それがアルゴリズムの授業の演習部分。
http://hagi.is.s.u-tokyo.ac.jp/~akitoshi/teaching/algo_enshu04/scheme/02.txt

問 3
階乗を計算する関数 fact を末尾再帰によって定義せよ。

問 4
末尾再帰を使って,フィボナッチ関数 fib を定義せよ。ここで,
フィボナッチ関数とは,以下の関係を満たす自然数上の関数のことである。

(fib 0) = 0
(fib 1) = 1
(fib (+ n 2)) = (+ (fib n) (fib (+ n 1)))

問 5
汎関数(ここでは,1 引数関数を 1 つ受け取って 1 引数関数を返す関数でよい)
不動点を求める関数 fix を定義せよ。

この関数を利用すれば,以下の式の評価は #t となる。

(letrec *1 n)))))
(fact
(lambda (n)
(if (< n 1) 1 (* (fact (- n 1)) n)))))
(= ((fix pre-fact) 51) (fact 51)))

問 6
問 5 で定義した fix を用いて,再帰を使わずに fib を定義せよ。


あのですね、問3と4に対して、残りの二つが難過ぎませんか。僕にはさっぱりです。っていうか、不動点って何さ。
いや、不動点自体はわかるよ。f(x) = xとなるようなxのことだよね。普通だと、この方程式を解けばいいんだよ。f(x) = x^2 なら、x^2 = x を解いて、x = 0, 1になるわけだね。ところが、この場合はそうじゃない。引数のxがまた関数になってる。意味わからない。
Google先生に聞いたら、いくつかサイトが出てきて回答そのままあったけどさ、回答の意味がわからないんですけど。なんとなくわかってきたので、気が向いたときの更新で解説を載せます。

*1:pre-fact (lambda (f) (lambda (n) (if (< n 1) 1 (* (f (- n 1