所以基本上这个代码的目的是简单地打印出前n个偶数。
for (i = 0; i <=n; i+= 2)
{
print i;
}
但事情是,我根本不懂Scheme。所以,请帮忙。
答案 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))))))
请注意:
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)))