是否可以在常见的lisp中使用嵌套循环?我试图将我的java代码转换为常见的lisp。我正在使用Steel Bank Common Lisp
继承人我要转换的内容
for(i=1; i<=59; i++){
k=1;
for(j=2; j<i; j++)
if(i % (j*j) == 0)
k=0;
if(k != 0)
System.out.println(i);
}
答案 0 :(得分:3)
所以我查看了你的Algol代码,并认为你可以使用嵌套循环来实现它,但我永远不会像这样生成algol代码,因为即使在你碰到一个多维数据集之后你也在迭代j
。
for(i=1; i<=59; i++){
var k=1;
for(j=2; j<i; j++) {
if(i % (j*j) == 0) {
k=0;
break;
}
}
if( k )
System.out.println(i);
}
我保持k
因为Algol不能像Lisps一样嵌套。在Lisp中,您将在if
内部取内部循环,从而消除了对布尔变量的需求。我将这份工作分成两个部分。生成从1到max-num的数字到列表中的数字,以及从列表中生成所需输出字符串的数字。两者都可通过单元测试进行测试。最后一个语句有副作用,因为它确实在返回之前打印结果。
(defun generate-list (max-num)
"generates a list of numbers from 1 to max-num
that which is not dividable by any cube of a lower
number greater than 1"
(loop :for i :from 1 :upto max-num
:if (not (loop :for j :from 2 :to i
:if (zerop (mod i (* j j)))
:do (return t))) ; inner loop terminates early :-)
:collect i))
(defun elements-to-string (list)
"Makes a string with all elements
of a list on individual lines"
(format nil "~{~a~^~%~}" list))
(princ (elements-to-string (generate-list 59)))
答案 1 :(得分:2)
为了帮助Lisp的新手:
(loop for i from 1 upto 59
do (let ((k 1))
(loop for j from 2 below i
do (when (zerop (rem i (expt j 2)))
(setf k 0)))
(when (not (zerop k))
(format t "~a~%" i))))
但是,变量k
应该是布尔值(t
或nil
)。