C ++
int loop(int x, int y, int z) {
int result = 0;
for ( int i = x; i < y; i+=z ) { result += i; }
return result; }
我只是按计划
尝试(letrec ((my-loop (lambda (a b c)
(begin
(let ((i a) (s 0))
(if (< i b)
(set! s (+ s i)) s))))))(my-loop (+ a c) b c))
请写出正确的方案代码....
答案 0 :(得分:3)
以下是对do
循环的直接翻译:
(define (foo x y z)
(do ((result 0 (+ result i))
(i x (+ i z)))
((>= i y) result)))
然而,许多Schemer发现do
循环令人反感。所以这是一个使用命名let
的相同循环,这实际上是do
可能扩展到的内容:
(define (foo x y z)
(let loop ((result 0)
(i x))
(if (>= i y)
result
(loop (+ result i) (+ i z)))))
可能会扩展为:
(define (foo x y z)
((rec (loop result i)
(if (>= i y)
result
(loop (+ result i) (+ i z))))
0 x))
然后扩展为:
(define (foo x y z)
((letrec ((loop (lambda (result i)
(if (>= i y)
result
(loop (+ result i) (+ i z))))))
loop)
0 x))
耶的宏!选择你最喜欢的版本;我知道的大多数Schemer更喜欢第二个。