【问题标题】:Nested Loops in Common LispCommon Lisp 中的嵌套循环
【发布时间】:2015-03-13 15:25:40
【问题描述】:

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

【问题讨论】:

  • 你试过什么? IIRC 你可以在 LISP 中嵌套几乎任何东西,这只是括号。
  • "It's all about the parentheses" 是我最喜欢的关于 Lisp 的说唱歌曲。

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


【解决方案1】:

所以我查看了您的 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)))

【讨论】:

    【解决方案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)。

    【讨论】:

    • 如果你在(setf k 0)之后结束内部loop,逻辑将匹配java代码(原来的缩进不正确)。
    猜你喜欢
    • 2012-12-11
    • 2013-05-16
    • 1970-01-01
    • 2021-09-12
    • 2018-02-21
    • 2021-12-25
    • 1970-01-01
    • 2016-08-09
    • 2010-12-12
    相关资源
    最近更新 更多