递归函数

时间:2013-02-26 18:04:10

标签: 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(符号列表),符号和数字(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)

2 个答案:

答案 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检查只是因为。