最初我发布了一个问题“了解尾递归向量-> 列表答案”,这是附加问题。我对方案的一般理解真的很模糊。所以我现在还有几个问题:
;;;;;; 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之外......?)。