1

使用する

(define (double fn) (lambda (x) (fn (fn x))))

方法を説明できますか

((((double double) double) 1+) 0)

16に等しい?? 置換を使用してどのように機能しますか?

4

2 に答える 2

1

このdouble関数は、引数として別の関数を受け入れ(その関数を呼び出しましょうfn)、任意の1つの引数を受け入れる関数を返します。その引数をfnに渡し、次にその結果をに渡しますfnこれが結果です。

例えば:

> ((double add1) 1)
3

1を呼び出してadd12を返し、次に2を呼び出しadd1て結果3を返します。

あなたの例では、doubleをそれ自体に渡すので、これで、与えられたときに、1+与えるものすべてに4を追加するプロシージャができました(2つdoubleの'があり、それぞれdoubleが2つの'を呼び出すため1+)。ただし、新しいプロシージャを別の doubleプロシージャに渡すと、8個になります(2個はすでに作成doubleした4個すべてによって呼び出されます)。doubleこれらの8つの呼び出しはそれぞれ1+2回行われます。

したがって、この新しいプロシージャは1+、指定した引数に対して2回、8回呼び出します。したがって、渡した引数に16が追加されます。

于 2013-02-07T03:38:19.033 に答える
0

置換を使用してどのように機能しますか?

Racket を使用している場合は、DrRacket のステッパー ツールを「ラムダを使用する中級者向け」言語で使用して、正確な置換手順を確認できます。

于 2013-02-08T18:38:04.513 に答える