2014-02-11 144 views
0

我一直在這個問題上停留了一段時間。我將一個謂詞和一個列表傳遞給方案中的另一個函數。如果謂詞爲真,則將其添加到答案列表中,否則將跳過它。例如,(myfilt positive? '(1 -2 3))應該是(1 3)。但我一直在收到(1 . 0)尾遞歸和CPS

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

回答

4

你的內心if應使用v爲else分支,而不是0。因此:

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