【问题标题】:Loop in PLT SchemePLT 方案中的循环
【发布时间】:2010-11-02 09:07:47
【问题描述】:

如何在 plt-scheme 中实现循环,就像在 java 中一样-

for(int i=0;i<10;){
     for(int j=0;j<3;){
          System.out.println(""+j);
          j++;
     }
      System.out.println(""+i);
      i++;
}

【问题讨论】:

  • 谢谢musicfreak,我正在学习。这就是我问这个问题的原因:) 计划文档对我来说并不清楚。但我想我很快就会习惯的。
  • 好的,只要确保这不是“为我做作业”的事情之一。 :) 我不知道 Scheme 但祝你好运!
  • 如果是作业问题,那么您会看到“问题”而不是“语法问题”。
  • 删除了称呼:“提前谢谢。”,下次不要包含它。

标签: syntax loops scheme racket


【解决方案1】:

您在 Java 中的示例不会通过学习一些新关键字直接映射到 Scheme 语言,因为在 Scheme 中没有用于实现 for 循环的显式构造(除非您自己编写构造!)。在 Scheme 中执行此操作的食谱方法是定义一个循环遍历列表的递归函数。下面是一个如何在 Scheme 中执行 for 循环样式函数的示例:

(define (doit x x-max dx)
  (if (<= x x-max)
    (begin
      ;;...perform loop body with x...
      (doit (+ x dx) x-max dx))))

(doit a b dx) ; execute loop from a to b in steps of dx

取自本页:

Guile and Scheme Links

这是另一个页面链接,该链接描述了将循环从命令式语言转换为 Scheme 时需要理解的想法:

Scheme Looping Constructs

Scheme 是一门非常有趣的语言,您还应该阅读 Structure and Interpretation of Computer Programs,这是以前在 MIT 用于教授 Scheme 的教科书。

【讨论】:

  • 没问题,这让我想起了我在大学里使用 Scheme 的积极经历。学习像 Scheme 这样的函数式语言可以让你成为一个更好的程序员,它可以帮助你思考问题的优雅解决方案。一旦您觉得 Scheme 开始变得有意义,我建议您检查另一种“不同”的语言,例如 Prolog。这与 Scheme 和 Java 都不同,它可以教给你不同的新东西。祝你好运。 :)
【解决方案2】:

在 PLT 中,您可以这样做:

(for ([i (in-range 10)])
  (for ([j (in-range 3)]) (printf "~s\n" j))
  (printf "~s\n" i))

【讨论】:

    【解决方案3】:

    Scheme中的迭代构造是“do”,你可以在R5RS specification中查找。

    您给出的示例如下所示:

    (do ((i 0 (+ i 1))) ((> i 9))
      (do ((j 0 (+ j 1))) ((> j 2))
        (display j)
        (newline))
      (display i)
      (newline))
    

    (do ...) 比本示例中显示的更通用。例如,您可以让它返回一个值,而不是仅仅将其用于其副作用。也可以有很多“计数器”:

    (do ((i 0 (+ i 1) 
         (j 0 (+ j 2)) 
        ((stop? i j) <return-value>)
       exprs...)
    

    【讨论】:

    • 要清楚,如果你不指出所有变量同时迭代,第二个有两个循环变量的例子会很棘手——一个'do'=一个循环。此示例将与 C 循环“for(i=0,j=0; !stop(i,j); i=i+1,j=j+2) {exprs();} return return_value; 密切对应.嗯,基本上是这样的。大多数情况下。
    • 是的,没错。我稍后会编辑帖子并尝试澄清一下。
    【解决方案4】:

    我建议你看看 Michele Simionato 的"The adventures of a pythonista in schemeland"。它适用于 python->scheme,但是,它真的写得很好,更重要的是,它来自procedural->functional。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      相关资源
      最近更新 更多