2010-03-30 70 views
3

好吧之一就是採取一個列表的列表,並返回每個子列表的汽車作爲一個列表。我已經把它打印出來了,但它不是一個列表。說實話,我不知道如何輸出列表。下面是我的了:方案功課問題,需要幫助的家庭作業問題

(define (car-print alist) 
    (if (null? alist) 
     (newline) 
     (begin 
     (write (car (car alist))) (display " ") 
    (car-print(cdr alist))))) 

這是一種廉價的方式來做到這一點,也許就真正解決這個問題,將不勝感激一些幫助。不一定是完整的答案,但步驟到達那裏。謝謝。

+0

@Richard,方案。 – 2010-03-30 01:21:14

+0

它應該是方案,一個lisp方言(與靜態範圍) – Eineki 2010-03-30 01:22:24

+0

@poorStudent有你一個輸入的例子嗎?你使用什麼方案級別? – Eineki 2010-03-30 01:23:42

回答

1

我的方案有點生疏。我剛纔在手DR-方案翻譯...

需要消耗你的清單,只返回每個子列表的第一個元素。要創建一個列表,您必須使用cons指令,並且不需要輸出它,您需要將其作爲函數結果返回(但您應該已經知道它)。

如果您需要打印的結果,你應該計算與輸出分離,在第二個步驟解決打印問題。

對於建立一個列表,你有幾個結構,最基本的就是缺點,它需要一個通用的元素(同樣是一個列表),並在前面加上一個列表(空一個,也可以)

(cons 1) => error: cons need two parameters 
(cons 1 null) => (list 1) 
(cons 1 2) => error: need a value (first parameter) and a list (the second one) 
(cons 1 (cons 2 null) => (list 1 2) 

現在到你的作業。通常我不張貼功課代碼,但這一次我覺得你只是一個暗示離解,所以有可能一個

(define (car-list alist) 
    (cond 
    ((null? alist) null) 
    (else (cons (car(car alist)) (car-list (cdr alist)))) 
) 
) 
; tail recursion version usage: (car-acc-list alist null) 
(define (car-acc-list alist acc) 
    (cond 
    ((null? alist) acc) 
    (else (car-acc-list (cdr alist) (cons (car(car alist)) acc))) 
) 
) 

我以前COND,而不是如果「原因我認爲它允許更好的代碼格式。 他的結構很簡單:條件列表,測試條件(或其他)作爲汽車和行動執行,如果條件滿足cdr。 如果行動決心的值((空?ALIST))函數的返回與該值作爲返回值。如果遞歸被觸發,那麼函數在遞歸完成時返回。

有兩個版本的解決方案,你應該使用步進/調試器來研究他們之間的分歧。

順便說一下,我用drscheme來測試代碼,它是一個非常棒的免費(lgpl)軟件。與其他計劃環境稍有不同之處在於代碼應該是非常基本的代碼,因此它應該在任何地方都沒有問題。

+0

非常感謝你的幫助。我仍然試圖學習這一點,所以我真的不知道計劃只是爲了上課迅速掌握它。 – poorStudent 2010-03-30 05:43:18

0

要設計一個函數,你需要知道你的工具是什麼。對於列表,您有:

cons : n l -> (n l) 
Construct a list out of an element and a list, placing the element n 
at the head of the list 

car : l -> n 
Return the head of the list 

cdr : l -> l 
Return the tail of the list 

你想編寫一個函數firstl消耗列表的列表,並返回一個列表。一些例子是:

(firstl (list (list 1 2 3) (list 9 2 3) (list 4 7 3))) -> (1 9 4) 
(firstl (list (list 1 2 3))) -> (1) 
(firstl '()) ->() 

最後一個例子應該給你的第一個線索:如果參數是一個空列表,返回一個空列表。

(define (firstl lol)  ; list-of-lists (no laughing!) 
    (if (null? lol) 
    '() 
    .... ; more stuff goes here for the recursive "else" clause. Hint: use cons 
)) 
+0

非常感謝你的幫助。 – poorStudent 2010-03-30 05:42:24

1

您應該使用map功能:

> (define lst '((1 2 3) (4 5 6) (7 8 9))) 
;Value: lst 
> (map car lst) 
;Value: (1 4 7)