【发布时间】:2016-10-26 22:26:54
【问题描述】:
我对 Scheme 和 StackOverflow 也很陌生! 所以,对于第一次接触,我想在 Scheme 中做一些简单易行的事情。 我想定义一个函数,减去引入列表的元素。
例如,输入应该是:(sub '(4 12 6) '(0 6 3)) 输出应该是:(4 6 3)
谢谢!!
【问题讨论】:
我对 Scheme 和 StackOverflow 也很陌生! 所以,对于第一次接触,我想在 Scheme 中做一些简单易行的事情。 我想定义一个函数,减去引入列表的元素。
例如,输入应该是:(sub '(4 12 6) '(0 6 3)) 输出应该是:(4 6 3)
谢谢!!
【问题讨论】:
您需要有一个基本情况,您可以检查其中一个列表是否为空并将其评估为空列表,或者您通过计算每个列表的第一个元素和其余部分的递归进行配对两个列表。基本上你会得到:
(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))
所以你去。你已经成功了一半。
【讨论】:
map 第二到 n 个参数需要是列表,因为它将过程应用于每个参数的第一个元素。 (car 1) 或 (cdr 1) 是什么?你可以这样做:(map (lambda (e) (- e 1)) '(11 12 13 14)) ;==> (10 11 12 13)
define 但你的 map 表达式在它之外。与我的评论不同,您的 map 中没有任何列表参数