2

我试图在 Racket 博士中创建“应用 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但想一想,返回的是什么?一个拉姆达

这意味着在您的情况下,我们正在尝试应用于cdrlambda,哎呀。

为了让这个 lambda 的值真正使用它,我们必须调用它。这样做很容易,只需更改

(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))))

好的,那么这个递归如何结束?那么当(- n whatever)为 0 时,我们返回 lambda

(lambda (x) x)

这真的把整个事情变成了

(F(F(F(F(F(F(Fx)))))))

这是我们想要的 applyNtimes 函数。

于 2012-11-03T09:43:38.043 回答