尾递归和CPS

时间:2014-02-11 03:24:32

标签: scheme racket tail-recursion

我一直坚持这个问题。我将谓词和列表传递给方案中的另一个函数。如果谓词为true,则将其添加到答案列表中,否则跳过它。

例如,(myfilt positive? '(1 -2 3))应为(1 3)。但我一直在(1 . 0)

(define myfilt
   (letrec ([testfilt (lambda (x poly function)
                        (if (empty? poly)
                            (function '())
                            (testfilt x (rest poly)
                                      (lambda (v)
                                        (function (if (x (car poly))
                                                      (cons (car poly) v)
                                                      0))))))]
            [identity (lambda (x) x)])
     (lambda (x poly)
       (testfilt x poly identity))))

1 个答案:

答案 0 :(得分:4)

你最内层的if应该使用v作为else分支,而不是0.因此:

(if (x (car poly))
    (cons (car poly) v)
    v)