2

ラケット博士で「N回適用」関数を作成しようとしていますが、どこが間違っているのかわかりません。私のコードは正しいようですが、明らかに何かが欠けています。以下に印刷されているのは、私が得ているコードとエラーです。

(define (applyNtimes F n)
  (lambda (x)
    (if (= n 0) x 
        (F (applyNtimes F (- n 1))))))

(define cdr3 (applyNtimes cdr 3))

(cdr3 '(1 2 3 4 4 5))

そしてこれは私が得ているエラーです:

cdr: contract violation
  expected: pair?
  given: #

期待される出力は

(4 4 5)
4

1 に答える 1

3

ここに問題があります、あなたはFのリターンに適用しようとしていますがapplyNtimes、少し考えてみてください、それは何を返しますか?ラムダ

これは、あなたの場合、cdrラムダ、フープに適用しようとしていることを意味します。

このラムダの値を取得して実際に使用するには、それを呼び出す必要があります。これを行うのはとても簡単で、変更するだけです

(F (applyNtimes F (- n 1))))))

(F ( (applyNtimes F (- n 1)) ;;Get the Lambda
     x))))) ;; and apply it to x

これを理解するために、それを分解してみましょう。まずF、何かに適用します。私たちの場合Fは本当にcdrそうなので、何らかの形のペアを与えるほうがよいでしょう。

このコードでは、「何か」はに適用(applyNTimes F (- n 1))した結果ですx

さて、これは私たちが実際に行っていることである再帰に私たちを導きます

(F (F (F ... ((applyNTimes F (- n whatever)) x))))

では、この再帰はどのように終了しますか?が0の場合(- n whatever)、ラムダを返します

(lambda (x) x)

これは本当にこのすべてをに変えます

(F(F(F(F(F(F x))))))

これが私たちの望ましいapplyNtimes関数です。

于 2012-11-03T09:43:38.043 に答える