首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在lengh-it函数体中使用`letrec`定义函数length

如何在lengh-it函数体中使用`letrec`定义函数length
EN

Stack Overflow用户
提问于 2021-02-17 14:44:47
回答 1查看 51关注 0票数 1
代码语言:javascript
复制
(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

EN

回答 1

Stack Overflow用户

发布于 2021-02-17 15:41:57

让我们从我们已有的内容开始:

代码语言:javascript
复制
(define length-it 
   (lambda (ls) 
      (length ls 0)))

但实际上,由于还有一个名为length的内置函数,让我们将我们的函数重命名为my-length

代码语言:javascript
复制
(define my-length
  (lambda (ls acc)
    (if (null? ls)
        acc
        (my-length (cdr ls) (+ acc 1)))))

而现在,

代码语言:javascript
复制
(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)吗?

接下来,

代码语言:javascript
复制
=
(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)

它现在起作用了吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66236923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档