Scheme 递归函数

Scheme 递归函数,scheme,racket,Scheme,Racket,我做了一个函数搜索,它接受一个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(

我做了一个函数搜索,它接受一个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(符号列表)、一个符号(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)

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


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

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

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

以下是一个解决方案:

(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))))))
change
的参数为我们提供了要替换的符号和位置。所以我们倒计时,重新创建列表,直到那一点。然后,当我们倒计时到0时,我们可以将列表中的当前符号替换为新符号,只需将其替换为当前符号即可。我添加了
<0
检查只是因为。

这里有一个解决方案:

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

change
的参数为我们提供了要替换的符号和位置。所以我们倒计时,重新创建列表,直到那一点。然后,当我们倒计时到0时,我们可以将列表中的当前符号替换为新符号,只需将其替换为当前符号即可。我添加了
<0
检查只是因为。

您是否打算命名您的函数
lookup
而不是
search
,也许?您是否打算命名您的函数
lookup
而不是
search