Ral*_*rix 2 common-lisp gnu-common-lisp
我们的任务是以这种方式打印出Pascal三角形中的值
(pascal 2)
(1 2 1)
(pascal 0)
(1)
Run Code Online (Sandbox Code Playgroud)
我将定义为二项式的代码复制到了互联网上的某处,定义如下:
(defun choose(n k)
(labels ((prod-enum (s e)
(do ((i s (1+ i)) (r 1 (* i r))) ((> i e) r)))
(fact (n) (prod-enum 1 n)))
(/ (prod-enum (- (1+ n) k) n) (fact k))))
Run Code Online (Sandbox Code Playgroud)
现在,我试图根据我的pascal函数中的值创建一个列表:
(defun pascal (start end)
(do ((i start (+ i 1)))
((> i end) )
(print (choose end i) ))
)
Run Code Online (Sandbox Code Playgroud)
如果使用(pascal 0 2)进行测试,该函数将产生1 2 1 NIL。如何消除NIL并创建列表?
注意:我明确没有提供的实现pascal,因为介绍性的“我们有任务……”表明这是一项家庭作业。
无需打印(choose end i)每次迭代的结果,只需将产生的值收集(choose end i)到结果列表中,然后在循环结束时返回结果。通常的习惯是通过将元素推入列表中以相反的顺序构造列表,然后使用nreverse反向来生成最终的返回值。例如,您可以range通过以下方式实现:
(defun range (start end &optional (delta 1) &aux (results '()))
(do ((i start (+ i delta)))
((>= i end) (nreverse results))
(push i results)))
Run Code Online (Sandbox Code Playgroud)
或(编写不需要体内任何代码的do/ do*循环总是让人感到满足。)
(defun range (start end &optional (delta 1))
(do* ((results '() (list* i results))
(i start (+ i delta)))
((>= i end) (nreverse results))))
Run Code Online (Sandbox Code Playgroud)
以便
(range 0 10 3)
;=> (0 3 6 9)
Run Code Online (Sandbox Code Playgroud)
但是,由于Pascal三角形中的行是回文,所以您无需反转它们。实际上,由于行是回文,您甚至应该能够调整循环以仅生成列表返回的一半,例如,
(revappend results results)
Run Code Online (Sandbox Code Playgroud)
当元素数量偶数时,以及
(revappend results (rest results))
Run Code Online (Sandbox Code Playgroud)
当有奇数时。
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |