Function 如何使用'letrec'定义函数';“长度”;在职能范围内”;“冷一点”;
如何使用Function 如何使用'letrec'定义函数';“长度”;在职能范围内”;“冷一点”;,function,recursion,scheme,letrec,Function,Recursion,Scheme,Letrec,如何使用letrec将函数length放入函数体length it 输出应该是(length it'(1 2 3))->3让我们从我们得到的开始: (define length-it (lambda (ls) (length ls 0))) (define length (lambda (ls acc) (if (null? ls) acc (length (cdr ls) (+ acc 1))))) 但实际上,由于还有一个内置函数名为
letrec
将函数length
放入函数体length it
输出应该是
(length it'(1 2 3))
->3
让我们从我们得到的开始:
(define length-it
(lambda (ls)
(length ls 0)))
(define length
(lambda (ls acc)
(if (null? ls)
acc
(length (cdr ls) (+ acc 1)))))
但实际上,由于还有一个内置函数名为length
,让我们将我们的函数重命名为my length
:
(define length-it
(lambda (ls)
(length ls 0)))
现在
(define my-length
(lambda (ls acc)
(if (null? ls)
acc
(my-length (cdr ls) (+ acc 1)))))
这行吗?init(2)
指的是什么实体?是不是init(1)
其次,
这行吗?(一定要在一个新的、新鲜的环境中进行测试,不要在那里单独定义my length
)
没有?为什么不呢
名称init(3)
指的是什么实体?我的长度(3)
指的是什么?名称my length(2)
指的是什么?如果我的长度(2)
指的是我的长度(1)
和我的长度(3)
一样,它会起作用吗?由于它不起作用,my length(2)
必须引用在let
上面定义的其他my length
,但是我们还有其他的my length吗
那么你能让它工作吗?您应该在那里使用let
,还是使用另一个原语letrec
?这两者完全一样吗?可能不会,否则为什么他们会给同一件事命名两次?那么我们可以试着用另一个吗?它是否会使我的长度(2)
确实像它应该做的那样引用我的长度(1)
现在能用了吗?你说…?-评论?反馈有什么事吗?如果OP使用了肘部润滑脂并成功地解决了这个问题,他们可能会学到一些东西。但是,在尝试上面的length it
的最终定义时,他们可能会感到困惑;当编译器发出错误时,内部长度
将与内置长度
混淆。将length
更改为my length
@adabsurdum谢谢,可以。@will Ness:非常感谢您的详细解释。它工作。@ USE1522564 -请考虑你觉得有用。这向未来的访问者发出了答案有效的信号,奖励了回答者花时间提供帮助(特别是像这样的详细答案),也给了你一个小的口碑。
(define length-it
(lambda (ls)
(my-length ls 0)))
=
(define length-it
(let ((init 0))
(lambda (ls)
(my-length ls 0)))) ;; (0)
=
(define length-it
(let ((init 0)) ;; (1)
(lambda (ls)
(my-length ls init)))) ;; (2)
=
(define length-it
(let ((init 0) ;; (0)
(my-length ;; (1)
(lambda (ls acc)
(if (null? ls)
acc
(my-length (cdr ls) (+ acc 1)))))) ;; (2)
(lambda (ls)
(my-length ls init)))) ;; (3)