首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >letrec,计划混淆

letrec,计划混淆
EN

Stack Overflow用户
提问于 2014-05-25 01:54:04
回答 3查看 865关注 0票数 1

我在纠结于让,勒特里克,让*.由于方案不是我的主要编程语言,我的内存在很长一段时间内都不存在。我有这个功能..。现在我对这里的letrec很困惑。这也是recursion.that,我可以understand...but无法在这段代码中建立足够的连接。(可能还是混淆了递归)有人能解释为什么这里需要letrec吗?

代码语言:javascript
复制
(define myFunc
  (lambda (start end res func)
    (letrec ((func:rec_func
              (lambda (x i y)
                (if (>= i start)
                    (func:rec_func (cons i x) (- i res) (cons (func i) y))  ;; line6
                    (cons x (cons y '()))))))                               ;; line7
      (func:rec_func '() end '()))))

(编辑)我所理解的是尾部递归

-> Q1,它是尾递归吗?

那么,-> Q2应该使用始终letrec进行尾递归吗?

此函数返回x,y的列表,其边界为开始,结束,因此它检查索引i在边界内,如果是,则执行第6行。

-> Q3then,line6是什么?我拿不到line6

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-25 03:38:47

Q1,它是尾递归吗?

回答是的,它做尾递归。

那么Q2,应该使用始终letrec进行尾递归吗?

回答有两种解释你问题的方法。

  1. 我们应该总是使用letrec进行尾递归吗?我觉得你不是故意要问这个的。但是..。 答案是否定的。顶层lambda函数也可用于尾递归。

  1. letrec应该总是使用尾递归吗? 答案是:任何递归函数最好是尾递归。如果可以的话,您应该使其尾部递归。

Q3那么line6是什么?

第6行的代码执行递归调用。

假设start0end5res1。在对func:rec_func的第一次调用中,x是空列表()i5y是空列表()

在第6行调用第一个递归函数时,参数是(cons i x)(- i res)(cons (func i) y),它们的计算值为:(5)4((func 5)

在下一次迭代中,参数是(4 5)3((func 4) (func 5))

它一直持续到i小于start为止。然后,递归以结果((0 1 2 3 4 5) ((func 0) (func 1) (func 2) (func 3) (func 4) (func 5)))停止。

当满足递归的终止条件时,即当(>= i start)为false时,将执行第7行的代码。

票数 0
EN

Stack Overflow用户

发布于 2014-05-25 05:39:42

letrec、let和let*的区别在于,当它们执行程序可用的声明时。

代码语言:javascript
复制
(letrec ((X (you could use X here))
         (Y (you could use X here too))
         )
     (X also is available here)
)


(let   ((X (nope, X isn't declared yet))
         (Y (in fact, no declaration body will see X))
         )
     (But X is available here)
)


(let* ((X (X isn't available here))
         (Y (but you could use it here))
         )
     (X also is available here)
)

概述:

  1. 用letrec声明的变量的作用域都在letrec的主体内。编译器执行一些魔术,以便在声明结束后替换引用。
  2. 使用let*声明的变量的作用域都是在变量声明后的let*范围中的表达式。
  3. 使用let声明的变量的作用域只是let的主体,而不是声明部分。
票数 7
EN

Stack Overflow用户

发布于 2014-05-25 02:00:35

如果我没记错的话,这个构造需要letrec而不是letlet*,因为func:rec_func的主体是指自己。如果在这里使用letlet*,嵌套lambda中的符号func:rec_func将绑定到顶层表单之外可见的任何定义,或者如果没有这样的定义,则没有定义--这也不是您想要的。

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

https://stackoverflow.com/questions/23851298

复制
相关文章

相似问题

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