2011-11-05 82 views
2

函數manageFirstList應該遞歸地將當前的一個元素複製到全局列表x中。全局變量和列表函數

(define test1DataA '(("a" "a") ("b" "b") ("c" "c") ("d" "d") ("e" "ok"))) 
(define test1DataB '(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("ok" "Ir OK!"))) 

(define x '()) 

(define manageFirstList 
    (lambda (a b) 
    ((cond ((not (null? b)) 
      ((append x (car a)) 
      (manageFirstList (cdr a) b))))))) 

(define ff (lambda (a b) (manageFirstList a b))) 

(ff test1DataA test1DataB) 

但它會導致一個錯誤:

car: expects argument of type <pair>; given '() 

的問題是:

  1. 如何更新全球價值'X'?
  2. 如何以正確的方式連接列表?
  3. 我可以打電話超過1個功能(或者是有一種變通方法)是這樣的:

    ((append x (car a)) 
    (manageFirstList (cdr a) b)) 
    

編輯:我試圖做的是建立與每個第一值的列表test1DataA列表項和每個test1DataB列表項的第二個值,其中test1DataA列表元素的第二個值與其list元素的test1DataB第一個值相同。

回答

2

關於你的問題:

  1. 雖然你可以使用(set! x <value>),你真的不應該,這不是用模式來編程的首選方法函數內更新全局變量;相反,您應該從您的程序中返回一個新列表,並在必要時將返回的值分配給x之後
  2. 「正確的方式」是什麼意思? append過程連接兩個列表,這是正確的方式來做到這一點,如果你問我:)。您只需調用它是這樣的:(append a b),其中兩個ab必須是列表
  3. 的代碼是錯誤的,因爲你周圍的一對額外的括號之間的呼叫append,計劃將嘗試應用價值由(append ...)返回,就好像它是一個參數爲(manageFirstList (cdr a) b)的過程,顯然它會失敗,因爲append返回一個列表,而不是一個過程。也許你應該解釋一下你的意思是「我可以打電話多個功能」 - 當然你可以,但你打算做什麼?結合來自兩個電話的結果?獨立處理結果?

不管怎麼說,上面的程序是要失敗的幾個原因 - 你不考慮的情況下,當列表是空的,你只是重複在列表中的一個,等

最後,你應該明確程序的預期結果是什麼,用(ff test1DataA test1DataB)調用後,你想在x看到什麼值?把它寫成你的問題的一部分,因爲文本「遞歸地複製一個元素到全局列表x」是不夠清楚的。

編輯:

好吧,這裏是我的投籃在回答你的問題,我希望我理解正確你。請注意,我使用的是assoc程序在第一列表搜索每個第二值,在第二個列表,因此解釋第二列表作爲關聯表:現在

(define (manageFirstList lst1 lst2) 
    (cond ((null? lst1) '()) 
     (else (cons (list (caar lst1) (cadr (assoc (cadar lst1) lst2))) 
        (manageFirstList (cdr lst1) lst2))))) 

,如果你絕對需要改變在x全局變量的值,只需做這樣的事情:

(define x '()) 
(set! x (manageFirstList test1DataA test1DataB)) 

注意我是如何徹底避免了需要修改x在過程中,因爲通常這不是計劃的方式來解決問題。最後,x的值爲:

(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("e" "Ir OK!")) 
+0

感謝您的解釋。我想要做的是創建一個列表,每個test1DataA列表項的第一個值和每個test1DataB列表項的第二個值,其中test1DataA列表元素第二個值與其列表元素的第一個test1DataB值相同。這是x值應該保持的。 – Trac3

+0

如果您只是按照需要編寫結果列表,而不是用文字解釋,那將會更加清晰。無論如何,我會給它一個鏡頭。 –

+0

謝謝:)你的回答確實幫助我更多地瞭解了SCHEME。 – Trac3