【问题标题】:Remove subsequence function (deep recursion) in Scheme using CPS使用 CPS 删除 Scheme 中的子序列函数(深度递归)
【发布时间】:2016-02-22 01:54:37
【问题描述】:

removesub* 接受一个原子列表和一个通用列表。第一个列表是第二个列表的子序列。该方法应返回第二个列表,其中删除了第一次出现的子序列。因此,如果第一个列表是 '(a b c),则第一个 a 如果第二个列表被删除,则删除 a 之后出现的第一个 b 被删除,并且删除 b 之后出现的第一个 c 被删除-无论如何原子嵌套的很深。

(removesub* '(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))))))))

【问题讨论】:

    标签: recursion scheme lisp


    【解决方案1】:

    对您的代码进行两个小改动后,我就可以开始工作了:

    1. 我在第一个cond 分支中将return l1 l2 更改为(return l1 l2)
    2. 我将底部的con 更改为cons

    祝你好运!

    【讨论】:

    • Ughhhhh 太令人沮丧了,没有错误信息会指出这样的事情!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2021-11-28
    • 1970-01-01
    • 2019-11-30
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多