Recursion drracket中的Lambda递归
我试图在Dr Racket中创建函数“应用N次”,但不知道哪里出错了。我的代码似乎是正确的,但显然我遗漏了一些东西。下面是我得到的代码和错误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
(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)