2013-11-14 113 views
0

我在賦值時遇到了一些問題。我必須創建一個請求列表和元素列表的過程,並繼續將元素添加到每個子列表中的第一個位置。我成功地做到這一點,它看起來像這樣:將元素插入到列表中的列表開頭

(define (add-element lst elem) 
    (foldr cons lst (list elem))) 

(define (insert-first lst1 x) 
    (cond 
    [(empty? lst1) empty] 
    [else (local [(define insert (add-element(first lst1) x))] 
     (cons insert (insert-first (rest lst1) x)))])) 

所以,如果你要輸入(insert-first '((a b) (c d))你想最終(list (list 'x 'a 'b) (list 'x 'c 'd))

唯一的問題是,我需要到代碼中使用map程序和local。後一個我認爲我已經完成了,但是我不能爲我的生活想出一個方法來使用map

+0

是否已進行了在這個問題上有何進展? –

回答

5
(define (insert-first elt lst) 
    (map (lambda (x) 
     (cons elt x)) 
     lst)) 

然後

(insert-first 'x '((a b) (c d))) 
=> '((x a b) (x c d)) 
0
(define (insert-first lst elem) 
    (foldr (lambda (x y) (cons (cons elem x) y)) '() lst)) 

關閉您的解決方案,但地圖更自然地適合於比折的問題,因爲你要想要做的事到列表中的每個元素。通過連續將函數應用於該列表的元素來累積值時,請使用摺疊。

0

foldr embodies一定的遞歸模式,

(foldr g init [a,b,c,...,z]) 
= (g a (foldr g init [b,c,...,z])) 
.... 
= (g a (g b (g c ... (g z init) ...))) 

如果我們手動展開在你的add-element函數定義的foldr電話,我們得到

(add-element lst elem) 
    = (foldr cons lst (list elem)) 
    = (cons elem (foldr cons lst '())) 
    = (cons elem lst) 

然後,看着你insert-first功能,我們可以看到它也跟隨foldr遞歸模式,

(insert-first lst1 x) 
= (foldr (lambda(a r)(cons (add-element a x) r)) empty lst1) 
= (foldr (lambda(a r)(cons (cons x a) r)) empty lst1) 

(foldr (lambda(a r) (cons (g a) r)) empty lst) === (map g lst),因爲要結合子條款與cons是建立一個列表,這是map做什麼;所以我們得到

(insert-first lst1 x) = (map (lambda(a)(cons x a)) lst1) 

,所以我們可以寫

(define (insert-first lst1 x) 
    (local [(define (prepend-x a) (cons ... ...))] 
    (map ... ...)))