我正在制作一个函数,它减去两个包含一元数的列表( lll = 3 或 llll = 4)
所以,它需要这样做:
~(usub '(l l l l) '(l l))
(l l)
现在,我有一个函数可以将它们相加,但没有一个可以减去它们。我认为它会接近添加一个,但我无法弄清楚。帮助?
(define (uadd ls1 ls2)
(if (null? ls1) ls2
(cons (car ls1) (uadd (cdr ls1) ls2))))
减去它的过程与添加的过程非常相似,根本区别在于,这里我们不必一路构建新列表,而是返回要减去的列表的子列表(ls1
在此代码):
; implements unary subtraction between two unary lists
; assuming that length(ls1) >= length(ls2)
; ls1: list we're subtracting from
; ls2: list we're subtracting
; returns ls1 - ls2
(define (usub ls1 ls2)
(if <???> ; is the list we're subtracting empty?
<???> ; then return the list we're subtracting from
(usub <???> <???>))) ; advance the recursion
显然,诀窍在于知道如何推进递归:请注意,我们正在减少两个列表的大小,直到其中一个用完,然后我们返回另一个 - 这就是我们减去的方式。例如:
(usub '(l l l l l) '(l l))
=> '(l l l)