(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。
发布于 2021-02-17 15:41:57
让我们从我们已有的内容开始:
(define length-it
(lambda (ls)
(length ls 0)))但实际上,由于还有一个名为length的内置函数,让我们将我们的函数重命名为my-length
(define my-length
(lambda (ls acc)
(if (null? ls)
acc
(my-length (cdr ls) (+ acc 1)))))而现在,
(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)这行得通吗?init(2)指的是什么实体?是init(1)吗?
接下来,
=
(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)现在这能起作用了吗?(请确保在一个新的、全新的环境中进行测试,而不是在那里单独定义my-length )。
不是吗?为什么不行?
名称init(3)指的是什么实体?my-length(3)指的是什么?my-length(2)这个名字指的是什么?如果my-length(2)像my-length(3)一样引用my-length(1),它会起作用吗?由于它不起作用,my-length(2)必须引用在let之上定义的其他my-length,但是我们在那里有更多这样的any吗?
那么你能让它工作吗?您是应该在那里使用let,还是应该使用另一个原语letrec?这两者是完全相同的吗?可能不会,否则为什么他们会给同一个东西命名两次?那么我们可以尝试使用另一个吗?这会不会让my-length(2)真的像它应该做的那样引用my-length(1)?
它现在起作用了吗?
https://stackoverflow.com/questions/66236923
复制相似问题