Хвостовая рекурсия и CPS

Я застрял на этой проблеме некоторое время. Я передаю предикат и список другой функции в схеме. Если предикат дает вам истину, вы добавляете его в свой список ответов, иначе пропускаете.

Например, (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 ответ

Ваш самый внутренний if следует использовать v для ветви else - не 0. Таким образом:

(if (x (car poly))
    (cons (car poly) v)
    v)
Другие вопросы по тегам