计划作业问题,需要帮助

时间:2010-03-30 01:18:42

标签: list scheme

好吧我的一个功课问题是拿一份清单并将每个子清单的车辆作为清单返回。我有它可以打印出值,但它不是一个列表。说实话,我不知道如何输出列表。这就是我得到的:

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

这是一种廉价的方法,也许对实际解决这个问题的一些帮助将非常感激。不一定是完整的答案,但步骤到达那里。感谢。

3 个答案:

答案 0 :(得分:1)

我的计划有点生疏。而且我手边还有一名计划翻译......

您需要使用您的列表并返回每个子列表的第一个元素。

要创建列表,您必须使用缺点指令,而不需要输出它,您需要将其作为函数结果返回(但您应该已经知道了)。 / p>

如果您需要打印结果,则应将计算与输出分开并在第二步中解决打印问题。

为了构建一个列表,你有几个构造,最基本的是缺点,它需要一个通用元素(也是一个列表)并将它添加到一个列表中(也是一个null)

(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 ,而不是 if ,因为我认为它允许更好的代码格式化。 他的结构很简单:一个子句列表,测试条件(或其他)作为汽车和动作,如果条件满足为cdr。 如果action解析为某个值((null?alist) null ),则该函数将返回该值作为返回值。如果触发递归,则递归完成时函数返回。

解决方案有两个版本,您应该使用步进器/调试器来调查它们之间的差异。

顺便说一下,我使用drscheme来测试代码,它是一个很棒的免费(lgpl)软件。与其他方案环境有细微差别,但代码应该是非常基本的,因此它应该在任何地方都没有问题。

答案 1 :(得分:1)

您应该使用map功能:

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

答案 2 :(得分: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
))