0

我正在制作一个函数,它减去两个包含一元数的列表( 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))))
4

1 回答 1

0

减去它的过程与添加的过程非常相似,根本区别在于,这里我们不必一路构建新列表,而是返回要减去的列表的子列表(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)
于 2013-04-24T16:09:58.447 回答