使用 CPS 删除 Scheme 中的子序列函数(深度递归)
Remove subsequence function (deep recursion) in Scheme using CPS
removesub*
采用原子列表和一般列表。第一个列表是第二个列表的子序列。该方法应该 return 删除第一次出现的子序列的第二个列表。所以,如果第一个列表是'(a b c),如果第二个列表被移除,则第一个a,被移除的a之后出现的第一个b被移除,被移除的b之后出现的第一个c被移除——不管如何原子嵌套很深。
(removesub* '(a b) '(w (x b) ((a) ((y z))) b))
Expected Output:
(w (x b) (() ((y z))))
我正在尝试使用连续传递样式 (CPS) 来完成此功能。对于这种复杂的功能,我真的很难掌握。 ,我能够尝试这个问题,但是我的尝试return是一个空列表。
我做错了什么?
尝试
(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))))))))
通过对您的代码进行两处小改动,我得到了一些有用的东西:
- 我在第一个
cond
分支中将 return l1 l2
更改为 (return l1 l2)
。
- 我把最后一行的
con
改成了cons
祝你好运!
removesub*
采用原子列表和一般列表。第一个列表是第二个列表的子序列。该方法应该 return 删除第一次出现的子序列的第二个列表。所以,如果第一个列表是'(a b c),如果第二个列表被移除,则第一个a,被移除的a之后出现的第一个b被移除,被移除的b之后出现的第一个c被移除——不管如何原子嵌套很深。
(removesub* '(a b) '(w (x b) ((a) ((y z))) b))
Expected Output: (w (x b) (() ((y z))))
我正在尝试使用连续传递样式 (CPS) 来完成此功能。对于这种复杂的功能,我真的很难掌握。
我做错了什么?
尝试
(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))))))))
通过对您的代码进行两处小改动,我得到了一些有用的东西:
- 我在第一个
cond
分支中将return l1 l2
更改为(return l1 l2)
。 - 我把最后一行的
con
改成了cons
祝你好运!