尾再次递归(Scheme)

时间:2014-05-14 12:58:31

标签: scheme tail-recursion

我实现了尾递归..因为尾递归确实很有挑战性。我无法弄清楚..所以最好的方法,也许尝试几个实现,直到它变得清晰..所以......这是我的代码。 。

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)))))

我找不到有什么问题。有人能指出吗?

2 个答案:

答案 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的版本以调用辅助函数,并且名称已修复。 编辑:我修改了变量名称。第一次没见到他们。