我在纠结于让,勒特里克,让*.由于方案不是我的主要编程语言,我的内存在很长一段时间内都不存在。我有这个功能..。现在我对这里的letrec很困惑。这也是recursion.that,我可以understand...but无法在这段代码中建立足够的连接。(可能还是混淆了递归)有人能解释为什么这里需要letrec吗?
(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
发布于 2014-05-25 03:38:47
Q1,它是尾递归吗?
回答是的,它做尾递归。
那么Q2,应该使用始终letrec进行尾递归吗?
回答有两种解释你问题的方法。
letrec进行尾递归吗?我觉得你不是故意要问这个的。但是..。
答案是否定的。顶层lambda函数也可用于尾递归。letrec应该总是使用尾递归吗?
答案是:任何递归函数最好是尾递归。如果可以的话,您应该使其尾部递归。Q3那么line6是什么?
第6行的代码执行递归调用。
假设start是0,end是5,res是1。在对func:rec_func的第一次调用中,x是空列表(),i是5,y是空列表()。
在第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行的代码。
发布于 2014-05-25 05:39:42
letrec、let和let*的区别在于,当它们执行程序可用的声明时。
(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)
)概述:
发布于 2014-05-25 02:00:35
如果我没记错的话,这个构造需要letrec而不是let或let*,因为func:rec_func的主体是指自己。如果在这里使用let或let*,嵌套lambda中的符号func:rec_func将绑定到顶层表单之外可见的任何定义,或者如果没有这样的定义,则没有定义--这也不是您想要的。
https://stackoverflow.com/questions/23851298
复制相似问题