2

これは、SICPビデオレクチャー、39:51マーク付近のレクチャー2aからのものです。

(DEFINE (SQRT X)
   (FIXED-POINT
      (AVERAGE-DAMP (LAMBDA Y (/ X Y)))
      1)) 

(DEFINE AVERAGE-DAMP
   (LAMBDA f
      (LAMBDA x (AVERAGE (f x) x))))

x2番目のラムダのはAVERAGE-DAMPで何をし、どのようにアクセスされますか?正確に何が渡されているのかわかりません。

4

4 に答える 4

3
(DEFINE AVERAGE-DAMP
   (LAMBDA f
      (LAMBDA x (AVERAGE (f x) x))))

これについて注意が必要なのは、関数がここで渡されていることです。

average-dampは、( "f of x")との平均として定義されるf関数として定義される関数です。xf(x)x

つまり、average-dampは、別の関数を受け入れ、その関数をラップしてから、この新しい関数を返す関数です。

万が一JavaScriptに精通している場合は、次のことが役立つ場合があります。

function average(a, b) {
    return (a + b)/2;
}

function averageDamp(f) {
    return function(x) {
        return average(f(x), x);
    }
}

では、次のことを考えてみてください。

var something = averageDamp(function (c) { return c * 2 });

somethingは、1つのパラメーター、を取りx、x*2とxの平均を返す関数です。

言い換えれば、それは次のようなものです:

function (x) {
    return average(x * 2, x);
}

あなたが持っていた場合:

var something = averageDamp(function (c) { return c * 2 });
something(5); //average(5*2, 5) = (10 + 5) / 2

関数を関数内にラップすることは、lispスニペットで起こっていることです。

編集:好奇心から、JavaScriptで固定小数点平方根アプローチを完全に実装しました:http://jsfiddle.net/tXDQL/

于 2012-05-28T10:14:18.673 に答える
1

の値は、関数に渡されるx引数になります。fixed-point

ここで、の定義を指定しませんでしたfixed-pointが、私が想像する名前から、最初に引数を使用して関数を呼び出し1(これは、の2番目の引数として指定されたものであるためfixed-point)、次に、結果が前の結果と同じになるまで、引数として前の結果。

したがって、最初の呼び出しでxは1になり、2番目の呼び出しでは1になり(average (f 1) 1)、3番目の呼び出しでは1になり(average (f (average (f 1) 1)) (average (f 1) 1))ます。

于 2012-05-28T10:15:52.873 に答える
1

AVERAGE-DAMPfは、パラメーターが与えられると別の関数(別のラムダ)を返す関数(ラムダ)として定義されます。パラメーターが与えられると、とxの平均を計算します。ここで、は以前に受け取った関数です。xf(x)f

次に、で、 1つのパラメーター(たまたま関数、ラムダ)で呼び出されるSQRT方法に注意してください。これにより、呼び出しが別の関数(の2番目のラムダ)に変換されます。この関数は、値が指定されると、指定された関数を指定された値に評価します。関数は、その関数を取得し、適切と見なす値ごとに前の関数を評価します。AVERAGE-DAMPAVERAGE-DAMP(LAMBDA Y (/ X Y))FIXED-POINT

于 2012-05-28T10:16:59.270 に答える
1
(DEFINE (SQRT X)
   (FIXED-POINT
      (AVERAGE-DAMP (LAMBDA Y (/ X Y)))
      1)) 

(DEFINE AVERAGE-DAMP
   (LAMBDA F
      (LAMBDA X (AVERAGE (F X) X))))

最初は混乱しているように見えるかもしれませんが、私が学習しているときにこれを明確にするために私が試みたのは、AVERAGE-DAMPの「X」を「Y」に置き換えることです。したがって、SQRTの引数としての「X」を区別するのに役立ちます。

(DEFINE (SQRT X)
   (FIXED-POINT
      (AVERAGE-DAMP (LAMBDA Y (/ X Y)))
      1)) 

(DEFINE AVERAGE-DAMP
   (LAMBDA F
      (LAMBDA Y (AVERAGE (F Y) Y))))

したがって、ここで発生するのは、
F->(LAMBDA Y(/ XY))、
次に(FY)->(/ XY)、
次に(AVERAGE-DAMP(LAMBDA Y(/ XY)))->(LAMBDA Y(AVERAGE (/ XY)Y))

于 2012-07-04T03:33:48.120 に答える