有人知道如何在Scheme中创建一个不带参数的函数,每次调用它都会返回0或1,具体取决于它被调用了多少次?例如,第1次返回1,第2次返回0,第3次等等。
我想我必须在函数中使用局部变量,但我不确切知道如何,所以每次调用它时它都会改变值。
答案 0 :(得分:1)
你没有说出你如何称呼你的功能。您是否将一些命名函数定义为随make-flip
函数返回的lambda?我想这是"关闭101"但这是我第一次回忆起来。无论如何,我试过这种方式似乎有效:
(define (make-flipper)
(let ((flip 0))
(lambda ()
(set! flip (if (= flip 0) 1 0))
flip)))
(define doit (make-flipper))
(doit)
(doit)
(doit)
- 结果为1,然后是0,然后是1.我猜你可以改变let中的值,如果你想让它以0开头。
答案 1 :(得分:0)
您的代码无效,因为您过度使用括号,这会使您的代码尝试调用非过程的“过程”。
您的代码,
(define (make-flip)
(let ((x 1))
(lambda ()
((set! x (- 1 x))
(if (= x 0) (1) (0))))))
尝试过程调用(0)
和(1)
,并尝试“调用”序列的结果
(set! x (- 1 x))
(if (= x 0) (1) (0)))
(Scheme永远不会像其他语言那样忽略任何括号。)
如果你修复了这些,
(define (make-flip)
(let ((x 1))
(lambda ()
(set! x (- 1 x))
(if (= x 0) 1 0))))
它有效。
虽然条件不是必要的,你也可以说
(define (make-flip)
(let ((x 0))
(lambda ()
(set! x (- 1 x))
x)))
并获得相同的结果。
答案 2 :(得分:0)
如果您只需要一个此类程序,您还可以执行以下操作:
(define flip
(let ((x 1))
(lambda ()
(begin0
x
(set! x (- 1 x))))))
测试:
> (flip)
1
> (flip)
0
> (flip)
1
> (flip)
0