0

我做了函数搜索,它接受一个 los,一个数字,并返回列表的第 num 个符号。简单的

(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(符号列表)、一个符号(s)和一个数字(numth),并返回 los,并将第 numth 个符号替换为 s。

像这样的东西-

(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)
4

2 回答 2

2

首先,考虑如何复制列表。这不会涉及num参数。

然后,如果列表元素为 0,则使用相同的num递减方法search来替换(而不是复制)列表元素num

于 2013-02-26T18:18:16.750 回答
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支票只是因为。

于 2013-02-26T18:18:42.083 回答