如何将此代码转换为Scheme

时间:2012-03-17 23:51:46

标签: for-loop scheme

所以基本上这个代码的目的是简单地打印出前n个偶数。

for (i = 0; i <=n; i+= 2)
{
    print i;
}
但事情是,我根本不懂Scheme。所以,请帮忙。

3 个答案:

答案 0 :(得分:1)

Scheme和其他语言之间的第一个重要区别是:在Scheme中,你(几乎)递归地执行所有操作。

例如,要实现一个简单的循环,您需要定义一个递归函数。该函数首先检查是否是时候退出循环;如果是,它将返回最终值。 (在这种情况下没有最终值,因此它只会返回(void)'()之类的内容。)否则,函数将执行它应该执行的任何操作,然后再次调用自身。

任何循环变量(例如i)都会成为函数的参数。

希望这有助于您了解如何执行此操作。

答案 1 :(得分:1)

这样做的方法是使用类似下面的递归函数。

(define (doit value n)
  (if (<= value n)
    (begin
      ;;...perform loop body with x...
      (display value)(newline)
      (doit (+ value 2) n))))

要调用此函数,请调用(doit 2 n),其中n是for循环中的n。

关于学习计划,我推荐下面的前两个链接。

有关Scheme的其他信息,请参阅

答案 2 :(得分:1)

几种方法可以将问题中的代码转换为Scheme。我能想到的第一个:

(define (print-even n)
  (let loop ((i 0))
    (if (<= i n)
        (begin
          (print i)
          (newline)
          (loop (+ i 2))))))

请注意:

  • 解决方案是作为递归过程编写的
  • 我使用名为let 的名为的构造而不是for循环,它允许初始化一些迭代变量(i在这种情况下,初始化到0)以及重复执行递归过程(在这种情况下为loop),产生类似于for的效果,即使在性能上也是如此
  • “循环”中的停止条件使用基本相同的表达式处理:只要(<= i n)重复迭代的主体,当该条件变为假时,迭代结束
  • begin围绕“循环”的主体,就像原始代码中的花括号{}一样
  • print过程执行预期的操作;为了便于阅读,我在打印每个数字后添加了一个新行
  • 原始循环i += 2的增量部分由递归调用中的表达式(+ i 2)处理

所以你看,正在执行的进程基本相同,只有的方式(语法!)是不同的。试一试,输入:

(print-even 6)

...以下内容将打印在屏幕上:

0
2
4
6

实现该过程的另一种可能方式,更类似于原始代码,虽然(这是完全主观的)比前一个更不惯用:

(define (print-even n)
  (do ((i 0 (+ i 2))) ((> i n))
    (print i)
    (newline)))

最后,如果你正在使用Racket,这对你来说似乎更为熟悉:

#lang racket

(define (print-even n)
  (for ((i (in-range 0 (+ n 1) 2)))
    (print i)
    (newline)))