我正在尝试实现两个功能:subterm 和 replace。
- subterm 将两个列表作为参数,并打印第一个列表中在用完第二个列表后到达的元素。
例如,调用
(subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(4 2 2 1))
应该返回
8
我想出了以下函数,它打印列表中的第 n 个元素:
(define (subterm list n)
(cond
((null? list) '())
((= n 1) (car list))
(else (subterm (cdr list) (- n 1)))))
- replace 接受 3 个列表并返回将达到的值替换为列表其余部分不变的结果。
例如调用:
(replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(11 12) '(4 2 2 1))
应该返回:
'(1 2 (3 4 5) (6 (7 ((11 12)) 9 10)))
同样,我想出了这段代码,它将第一个列表中的第 n 个元素替换为第二个列表,而第一个列表的其余部分保持不变:
#lang racket
(define (replace list elem n)
(cond
((empty? list) empty)
((eq? n 1) (cons elem (cdr list)))
(#t (cons (car list) (replace (cdr list) elem (- n 1))))))
如何修改这些函数以获取两个列表?
编辑1:一些例子:
> (subterm '(1 2 3 4 5) '(3))
3
> (subterm '(1 2 3 4 5) '(2))
2
> (subterm '(1 2 (3 4 5) 6 7) '(3 2))
4
考虑这个例子:
> (subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(4 2 2 1))
8
在上面的示例中, subterm 需要 2 个列表。然后它读取第二个列表。第二个列表基本上告诉 subterm 返回第 1 个元素 (8) 第 2 个元素 ((8)) 第 2 个元素 (7 (8) 9 10) 第 4 个元素 (6 (7 (8) 9 10)第一个列表 (1 2 (3 4 5) (6 (7 (8) 9 10)))。
> (subterm '1 '())
1
> (subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '())
'(1 2 (3 4 5) (6 (7 (8) 9 10)))
> (replace '(1 2 3 4 5) '(6 7 8) '(3))
'(1 2 (6 7 8) 4 5)
> (replace '(1 2 3 4 5) '(6 7 8) '(2))
'(1 (6 7 8) 3 4 5)
考虑这个例子:
> (replace '(1 2 (3 4 5) 6 7) '(8 9) '(3 2))
'(1 2 (3 (8 9) 5) 6 7)
replace 包含三个列表:第一个列表是必须替换元素的列表。第二个列表包含必须放入第一个列表的新元素。第三个列表包含必须替换元素的位置。因此,它基本上取代了第一个列表 (1 2 (3 4 5) 6 7) 的第三个元素 (3 4 5) 的第二个元素 (4)。
> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(11 12) '(4 2 2 1))
'(1 2 (3 4 5) (6 (7 ((11 12)) 9 10)))
> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) 1000 '(4 2 2 1))
'(1 2 (3 4 5) (6 (7 (1000) 9 10)))
> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) 'x '())
'x
> (replace '1 '(2 3 4) '())
'(2 3 4)