我做了一个函数搜索,它接受一个los,一个数字,然后返回列表的numth符号。简单
(define (search los num)
(cond
[(empty? los) empty]
[(zero? num) (first los)]
[else (lookup (rest los) (- num 1))]))
(check-expect (lookup (list 'a 'b 'c 'd) 0) 'a)
但我无法弄清楚如何设计一个带有los(符号列表),符号和数字(numth)的函数,并返回带有用s替换的numth符号的los。
像这样的事情 -(change (list 'a 'b 'c 'd) 'hello 2) ;==> (list 'a 'b 'hello 'd)
(change (list 'a 'b 'c 'd) 'hi 0) ;==> (list 'hi 'b 'c 'd)
答案 0 :(得分:2)
首先,考虑如何复制列表。这不会涉及num
参数。
然后,如果num
为0,则使用search
中相同的num
- 递减方法替换(而不是复制)列表元素。
答案 1 :(得分:2)
这是一个解决方案:
(define (change los s num)
(cond ((null? los) '())
((< num 0) los)
((= num 0) (cons s (cdr los)))
(else (cons (car los) (change (cdr los) s (- num 1))))))
基本上,这个想法是递归地重新创建列表,但是有一个扭曲(用s替换第n个符号)。
因此,为了递归“重新创建”列表,我可以:
(define (lst los)
(if (null? los)
'()
(cons (car los) (lst (cdr los)))))
change
的参数为我们提供了要替换的符号和要替换的位置。所以我们倒计时,重新创建列表直到那一点。然后,当我们倒数到0时,我们可以用新符号替换列表中的当前符号,只需将其替换为当前符号。我添加< 0
检查只是因为。