Recursion drracket中的Lambda递归

Recursion drracket中的Lambda递归,recursion,lambda,lisp,syntax-error,racket,Recursion,Lambda,Lisp,Syntax Error,Racket,我试图在Dr 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: contra

我试图在Dr 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)

问题是,您正试图将
F
应用于
applyNtimes
的返回,但请思考一下,该返回什么λ

这意味着在你的情况下,我们正在尝试对lambda应用
cdr
,哎呀

为了得到这个lambda的值以实际使用它,我们必须调用它。做这件事很容易,只要改变一下就行了

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

为了理解这一点,让我们将其分解,首先我们将
F
应用于某个对象。因为在我们的例子中,
F
实际上是
cdr
我们最好给它一些成对的形式

在此代码中,“某物”是将
(applyNTimes F(-n 1))
应用于
x
的结果

这就引出了一些递归,我们真正做的是

(F (F (F ... ((applyNTimes F (- n whatever)) x))))
那么这个递归是如何结束的呢?当
(-n无论如何)
为0时,我们返回lambda

(lambda (x) x)
这真的把整件事变成了

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


这是我们想要的applyNtimes函数。

这可以工作,但您能解释一下语法吗?我的大脑在括号中间的某个地方被炸了。如果我错了,请纠正我,但这是你在做的吗?(cdr((lambda)x))@TdotThomas编辑了更完整的解释
(lambda (x) x)