2012-11-18 47 views
4

我尝试创建一个与two arguments x and y创建一个功能,它创建一个list of y times repeated elements X但即时通讯如何做到这一点或使用哪种方法,我认为列表压缩可以做但我想要一个更简单的方法例如,我想我的简单代码是这样的重复共同lisp的元素

if y = 4 
and x = 7 
result is list of elements (7, 7, 7, 7) 

我怎么能去任何想法?书籍的链接或任何会给我一个线索我试图寻找,但我没有被幸运

回答

1

试试这个,它的方案,但总体思路应该是很容易转化为Common Lisp的:

(define (repeat x y) 
    (if (zero? y) 
     null 
     (cons x 
      (repeat x (sub1 y))))) 

编辑:现在

,Common Lisp中:

(defun repeat (x y) 
    (if (zerop y) 
     nil 
     (cons x 
      (repeat x (1- y))))) 
+0

如果'if'的某个结果无论如何都是'nil',那么对于我来说,否定条件就会更清晰,并且只留下第二个(“else”)参数,该参数默认为'nil' if未指定:'(if(not(zerop y))(cons x(repeat x(1- y))))'。 –

+0

@MarkReed我不喜欢单手武装的“if”。他们被禁止在球拍上有充分的理由;) –

18

您可以使用make-list初始元素键:

CL-USER> (make-list 10 :initial-element 8) 
    (8 8 8 8 8 8 8 8 8 8) 

虽然你怎么可以自己编写这样的功能一个很好的例子是奥斯卡的答案提供。

+0

这应该是公认的答案 – fpg1503