2013-02-26 176 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