2015-04-07 45 views
2

我試圖實現兩個功能:子項和替換。打印和替換列表中的元素的函數

  1. subterm將兩個列表作爲參數,並在耗盡第二個列表後到達的第一個列表中打印該元素。

例如,調用

(subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(4 2 2 1))

應該返回

8 

我想出了以下功能,打印第n個元素的列表:

(define (subterm list n)     
    (cond 
    ((null? list) '())    
    ((= n 1) (car list))    
    (else (subterm (cdr list) (- n 1))))) 
  1. replace需要3個列表,並返回替換已達到值的結果,其餘列表不變。

例如呼叫:

(replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(11 12) '(4 2 2 1)) 

應該返回:

'(1 2 (3 4 5) (6 (7 ((11 12)) 9 10))) 

再次,我想出了這個代碼,它取代與第二列表的第一個列表中的第n個元素,留下其餘第一個清單不變:

#lang racket 
(define (replace list elem n) 
    (cond 
    ((empty? list) empty) 
    ((eq? n 1) (cons elem (cdr list))) 
    (#t (cons (car list) (replace (cdr list) elem (- n 1)))))) 

如何修改這些函數以獲取兩個列表?

編輯1: 一些例子:

> (subterm '(1 2 3 4 5) '(3)) 
3 

> (subterm '(1 2 3 4 5) '(2)) 
2 

> (subterm '(1 2 (3 4 5) 6 7) '(3 2)) 
4 

考慮這個例子:

> (subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(4 2 2 1)) 
8 

在上述例子中,subterm需要2名列表。然後它讀取第二個列表。第二列表基本上告訴子項返回第四元素(6(7(8)9 10))的第二元素(7(8)9 10)的第二元素((8))的第一元素(8)第一列表(1 2(3 4 5)(圖6(圖7(8)9 10)))

> (subterm '1 '()) 
1 

> (subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '()) 
'(1 2 (3 4 5) (6 (7 (8) 9 10))) 

> (replace '(1 2 3 4 5) '(6 7 8) '(3)) 
'(1 2 (6 7 8) 4 5) 

> (replace '(1 2 3 4 5) '(6 7 8) '(2)) 
'(1 (6 7 8) 3 4 5) 

考慮這個例子:

> (replace '(1 2 (3 4 5) 6 7) '(8 9) '(3 2)) 
'(1 2 (3 (8 9) 5) 6 7) 

替換髮生在三個列表:第一列表是元素必須被替換的列表,第二個列表包含必須放入第一個列表的新元素,第三個列表包含元素必須被替換的位置 因此,它基本上取代了第二個元素元素(4)第一個列表的第三個元素(3 4 5)(1 2(3 4 5)6 7)。

> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(11 12) '(4 2 2 1)) 
'(1 2 (3 4 5) (6 (7 ((11 12)) 9 10))) 

> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) 1000 '(4 2 2 1)) 
'(1 2 (3 4 5) (6 (7 (1000) 9 10))) 

> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) 'x '()) 
'x 

> (replace '1 '(2 3 4) '()) 
'(2 3 4) 
+0

當你說這些功能_時,你指的是什麼?是否有可能使'替換'的元數等於2?在我看來,你錯過了一些解釋。 –

+0

@DavidMerinos:這些功能的含義是子目錄和替換。爲了清晰起見,我添加了一些示例。謝謝! – no10downingstreet

+0

好的。我明白了這些功能的作用,但究竟是什麼問題呢?你想'替換'只接受**兩個列表? –

回答

1

首先,您使用名稱subterm兩個不同的功能。讓我們打電話給你list-ref提供的代碼示例的版本,使(car list)情況發生時n = 0而不是1:

(define (list-ref list n)     
    (cond 
    ((null? list) '())    
    ((= n 0) (car list))    
    (else (list-ref (cdr list) (- n 1))))) 

事實證明,list-ref已經在racket庫,所以你不應該」首先要真正實施它。所以使用,您subterm很簡單:

(define (subterm main-list path) 
    (match path 
    ('() #f) 
    ((list n) (list-ref main-list (sub1 n))) 
    ((cons n rest) (subterm (list-ref main-list (sub1 n)) rest)))) 
+0

有關替換功能的任何想法? – no10downingstreet

0

我試圖編寫的程序replace。憑我的知識,我可以說這是一個難題。不過,我設法讓它至少在你給出的例子中起作用。您可以閱讀它,嘗試理解它,然後嘗試修改它以與任何其他列表一起使用。我相信你需要額外的功能才能正常工作。

#lang racket 
(require racket/trace) 
(define (replace list elem n) 
    (cond 
    ((empty? list) empty) 
    ((eq? n 1) (cons elem (cdr list))) 
    (#t (cons (car list) (replace (cdr list) elem (- n 1)))))) 

(define replace-with-lists 
    (λ (items replacement path res aux) 
    (letrec ([splits (list-split-at items (car path) '())]) 
    (cond 
     ((empty? (cdr path)) 
;  (append 
;  (car (list-ref res 0)) 
;  (list (append 
;  (car (list-ref res 1)) 
;  (list (append (car aux) 
;    (replace (list-ref aux 1) replacement (car path)) 
;    (list-ref aux 2))))))) 
     (let ([result (replace splits replacement 2)]) 
     (replace aux 
       (append (car result) 
       (list (cadr result)) 
       (caddr result) 
      ) 
       2))) 

     (else 
     (replace-with-lists 
      (list-ref splits 1) 
      replacement 
      (cdr path) 
      (foldr cons (list (list 
          (list-ref splits 0) 
          (list-ref splits 2))) 
        res) 
      splits 
      ))) 
    )) 
    ) 

(define list-split-at 
    (λ (lst place res) 
    (cond 
     ((empty? lst) res) 
     ((= 1 place) (foldl cons 
          (list (cdr lst)) 
          (foldr cons (list res) (list (car lst))) 
         )) 
     (else 
     (list-split-at (cdr lst) (- place 1) (foldr cons (list (car lst)) res)) 
     ) 
    ))) 
(trace replace-with-lists) 
0

好吧,我在你的編程語言類,並且我知道這個任務是因爲明天,所以我不想幫太多,或者給你答案。如果你還在掙扎,我會盡我所能給你一些提示。以下提示用於替換功能。

首先,您需要一個基本案例。我們用以下

給出這個(替換 '(1 2(3 4 5)(圖6(圖7(8)9 10)))' × '()) ' ×

(替換 '1'(2 3 4) '()) '(1 2 3 4)

要做到這一點,我們只需要一個檢查一個空列表條件語句。很顯然,如果最後一個參數是一個空列表,我們需要「返回」倒數第二個參數。 (在你的代碼中,這將是「elem」和「n」)

現在來了困難的部分。這真的很簡單,一旦你意識到有多少內置函數scheme/racket。這是我使用的唯一的,但他們解決問題要容易得多。

(附加) (列表) (取) (滴) (列表-REF)//這是一個更便利比什麼的。

日期過後,我會發布我的解決方案。希望這有助於。

編輯:由於這項任務是由於幾分鐘,我會發布我的解決方案,因爲我不認爲這會被認爲是作弊。

郎球拍

(define (subterm term1 lat) 
    (cond 
    [(eqv? lat '()) term1] 
    [(eqv? (car lat)1) (subterm (car term1) (cdr lat))] 
    [else (subterm (cdr term1) (cons(-(car lat)1)(cdr lat)))]) 
) 

(define (replace term1 term2 lat) 
    (cond 
    [(eqv? lat '()) term2] 
    [else (append(take term1 (-(car lat)1)) (list(replace (list-ref term1 (-(car lat)1)) term2 (cdr lat))) (drop term1 (car lat)))])) 

那些是兩種功能。