我实现了尾递归..因为尾递归确实很有挑战性。我无法弄清楚..所以最好的方法,也许尝试几个实现,直到它变得清晰..所以......这是我的代码。 。
tail recursion practice
(define (tstFunc lst1 lst2)
(define (tstFunc-helper ls1 ls2 rst)
(if (or (null? ls1) (null? ls2))
rst
(tstFunc-help (cdr ls1) (cdr lst2)
(cons (tstFunc lst1 lst2) rst)))))
我找不到有什么问题。有人能指出吗?
答案 0 :(得分:3)
您的职能是:
(define (tstFunc lst1 lst2) ; 0
(define (tstFunc-helper ; helper function 1
ls1 ; its 1st argument <-----------------\ 2
ls2 ; 2nd argument <--------------\ | 3
result ) ; 3rd argument | | 4
; | | 5
(if (or (null? ls1) (null? ls2)) ; | | 6
result ; return result, OR | | 7
(tstFunc-help ; call self with | | 8
(cdr ls1) ; as the next 'ls1' ----|--/ 9
(cdr lst2) ; as the next 'ls2' ----/ 10
(cons ; as the next 'result' 11
(tstFunc lst1 lst2) ; prefix this value (*) 12
result) ; to current "result", to 13
; construct the next "result" 14
))) ; 15
; 16
)
您定义了辅助函数(1),但不要将其命名为(16)。典型的初始呼叫将使用一些初始&#34;结果&#34;值,如列表构造'()
。
在内部函数(10,12)中引用外部函数的参数。允许,很可能不是你想要的 - 特别是lst2
&#34;作为下一个&#39; ls2&#39;&#34;永远不会改变,永远是同一个名单。
您通过调用主函数(0)在每个步骤中组合列表(12),从而创建无限递归。你应该使用一些第三个功能来组合它们。通常我们会合并列表中的car
,但有时也需要列表本身,这不是问题所在。但是你又在那里使用了错误的参数名称。
由于您通过使用(11)来构建结果,您可能希望将最终结果(7)反转回原始顺序。
答案 1 :(得分:0)
Will的代码不起作用。他没有调用辅助函数。此外,当他在递归中调用它时,他使用了错误的名称。虽然您没有指定所需的类型或结果,但此代码确实有效。
(define (tstFunc lst1 lst2)
(define (tstFunc-helper ; helper function
ls1 ; its 1st argument <-----------------\
ls2 ; 2nd argument <--------------\ |
result ) ; 3rd argument | |
; | |
(if (or (null? ls1) (null? ls2)) ; | |
result ; return result, OR | |
(tstFunc-helper ; call self with | |
(cdr ls1) ; as the next 'ls1' ----|--/
(cdr ls2) ; as the next 'ls2' ----/
(cons ; as the next 'result'
(cons ls1 ls2) ; prefix this value (*)
result) ; to current "result", to
; construct the next "result"
)))
(tstfunc-helper lst1 lst2 '()))`
这是修改了Will的版本以调用辅助函数,并且名称已修复。 编辑:我修改了变量名称。第一次没见到他们。