在Scheme中创建一个函数来减去两个列表

时间:2016-10-26 22:26:54

标签: list function scheme

我是Scheme的新手,也是StackOverflow的新手! 因此,对于第一次接触,我想在Scheme中做一些简单易行的事情。 我想定义一个减去引入列表元素的函数。

例如,输入应为:(sub'(4 12 6)'(0 6 3)) 输出应为:(4 6 3)

谢谢!

1 个答案:

答案 0 :(得分:0)

你需要的是有一个基本情况,你检查一个列表是否为空并将其评估为空列表,或者你计算每个列表的第一个元素和其余的递归这两个清单。基本上你最终得到:

(cons (- 4 0) (cons (- 12 6) (cons (- 6 3) '()))) ; ==> (4 6 3)

作为递归列表处理函数的一个例子,这里是一个否定所有元素的函数:

(define (negate-list lst)
  (if (null? lst)
      '()
      (cons (- (car lst)) 
            (negate-list (cdr lst)))))

(negate-list '(1 2 3 4)) ; ==> (-1 -2 -3 -4)

现在有更多奇特的方法可以做到这一点。例如,。你可以使用尾递归:

(define (negate-list lst)
  (let loop ((lst lst) (acc '()))
    (if (null? lst)
        (reverse acc)
        (loop (cdr lst)
              (cons (- (car lst)) acc)))))

您可以使用map

(define (negate-list lst)
  (map - lst))

所以你去吧。你在那里的一半。