使用CPS删除Scheme中的子序列函数(深度递归)

时间:2016-02-22 01:54:38

标签: recursion scheme lisp

removesub*获取原子列表和一般列表。第一个列表是第二个列表的子序列。该方法应该返回第二个列表,并删除子序列的第一个出现。因此,如果第一个列表是'(abc),则第一个列表如果删除第二个列表,则删除删除的a后出现的第一个b,并且删除删除的b后出现的第一个c - 无论原子嵌套多深。

  

(removedub *'(a b)'(w(x b)((a)((y z)))b))

     

预期产出:   (w(x b)(()((y z))))

我正在尝试使用连续传递样式(CPS)来完成此功能。对于这种复杂性的功能,我很难掌握这一点。 With the help of a previous stackoverflow question,我能够尝试解决问题,但我的尝试返回一个空列表

我做错了什么?

尝试

(define removesub*
  (lambda (l1 l2 return)
    (cond
      ((or (not (pair? l1)) (not (pair? l2))) return l1 l2)
      ((pair? (car l2))
       (removesub* l1
                   (car l2)
                   (lambda (v1 v2car)
                     (removesub* v1
                                 (cdr l2)
                                 (lambda (v1 v2cdr)
                                   (return v1 (cons v2car v2cdr)))))))
      ((eq? (car l1) (car l2))
       (removesub* (cdr l1) (cdr l2) return))
      (else
       (removesub* l1
                   (cdr l2)
                   (lambda (v1 v2)
                     (return v1 (con (car l2) v2))))))))

1 个答案:

答案 0 :(得分:1)

通过对代码进行两处小改动,我得到了一些工作:

  1. 我在第一个SmartMimeMessage分支中将return l1 l2更改为(return l1 l2)
  2. 我在底线将cond更改为con
  3. 祝你好运!