Common Lisp中的嵌套循环

时间:2015-03-13 15:25:41

标签: java loops lisp common-lisp nested-loops

是否可以在常见的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);
}

2 个答案:

答案 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应该是布尔值(tnil)。