【发布时间】:2014-06-26 21:06:01
【问题描述】:
最初我发布了一个问题“understanding a tail-recursive vector->list answer”,这是附加问题。我对方案的一般理解真的很模糊。所以我现在还有几个问题:
;;;;;; original code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define vector->list:rec
(lambda (v)
(letrec ((helper
(lambda (vec r i)
(if (< i 0)
r
(helper vec (cons (vector-ref v i) r) (- i 1)) ;; Q1
))))
(if (> (vector-length v) 0) ;; line 9
(helper v ;; line 10
(cons (vector-ref v (- (vector-length v) 1)) '())
(- (vector-length v) 2))
'()))))
Q2) 尾递归,这让我很难理解。我理解他们为什么需要尾递归,基本上他们使用它来避免迭代,所以他们使用帮助程序作为中间例程..所以他们可以避免将每次迭代放入堆栈......这样的事情。和 letrec/lambda 表达式如下:
;;;;;;;;;letrec/lambda express;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (some-procedure...)
(letrec ((helper (lambda (x)
...
(if some-test?
(helper ...))))) ; recursive call --- Q2-1
...
(helper ...) ; call to recursive local procedure ---- Q2-2
...))
第 Q2-2 行:为什么这是“局部递归”? “本地”对我来说听起来像是中间例程的递归......这里的中间意味着我的理解......
[我的困惑] 尾递归在整个程序结束之前不应该迭代(调用)本身 - 所以不应该在中间例程中.. = 不应该在里面帮手?根据我到目前为止的理解......助手是用于封装在letrec表达式中的中间例程......?。)所以最后只调用自己。(我的意思......:在letrec之外......?)。
【问题讨论】:
-
哇。试着把你的问题分解成更小、更简单、更容易理解的问题。还要确保在适用的情况下使用
inline code formatting。这很难阅读。 -
首先阅读this answer。你明白里面的一切吗?
-
“调用递归本地过程”是指调用本地过程,它(过程)是递归的。
标签: scheme tail-recursion letrec