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)