2013-02-26 180 views
0

我做了一个函数搜索,得到一个数,然后返回列表的第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) 

,但我有麻烦找出如何设计一个函数,接受洛杉矶(符号列表),符号(S)和一个数字(numth),并代之以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) 
+0

你打算命名你的函数'lookup'而不是'search',或许? – 2013-03-11 14:21:15

回答

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

2

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

然后,使用相同的num -decrementing方法,你必须在search更换(而不是复印件)列表元素,如果num为0