方案缺点创建一个正确的列表

时间:2010-11-02 21:50:00

标签: list scheme racket

我无法在此方案功能中附加到列表中。

该函数用于获取2个参数,并返回由第2个元素组成的列表,第1个元素中指定的次数。例如,如果您致电(make-list? 5 4),则输出应为(4 4 4 4 4)

问题是当我使用cons时,我得到了((((4 . 4) . 4) . 4) . 4)。据我了解,我每次都将整个列表的末尾附加为对象,不是我想要的最后一个元素。我不确定如何解决它。

这是我的功能,关于如何利用最后一个元素而不是列表作为对象的建议会很棒。 (或其他建议,如果这不是唯一/真正的问题。)

;make-list
(define make-list?
  (lambda (N A)
    (if (= N 1)
       A
       (cons (make-list?(- N 1) A ) A)
    )
  )
)

2 个答案:

答案 0 :(得分:2)

一个好的经验法则是每个列表都由'()终止。在这种情况下,将基础案例设为0并使其返回空列表可能更具说明性:

(define make-list?
  (lambda (n a)
    (if (zero? n)
        '()
        (cons a (make-list (sub1 n) a)))))

所以在这个例子中,如果我们点击0,那么我们返回空列表以“封锁”我们正在构建的列表。

答案 1 :(得分:1)

你的问题很烦人,是由于细胞的工作原理。 (cons a b)如果b不是列表,则创建cons单元格。通过重新排序,你将原子添加到列表中,而不是相反,并使其成为最里面的项目是一个列表(顺便说一下,你可以使用(cons A'())而不是(列表A)在下面的定义中,你可以解决这个问题。

(define make-list?
  (lambda (N A)
    (if (= N 1)
       (list A)
       (cons A (make-list?(- N 1) A ))
    )
  )
)