2010-03-30 73 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)