Scheme中的翻转功能

时间:2016-11-16 16:39:26

标签: function scheme

有人知道如何在Scheme中创建一个不带参数的函数,每次调用它都会返回0或1,具体取决于它被调用了多少次?例如,第1次返回1,第2次返回0,第3次等等。

我想我必须在函数中使用局部变量,但我不确切知道如何,所以每次调用它时它都会改变值。

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