繁体   English   中英

方案中的翻转功能

[英]Flip function in Scheme

有谁知道我该如何在Scheme中创建一个不带任何参数的函数,每次调用该函数都返回0或1,具体取决于调用了多少次? 例如,第一次返回1,第二次返回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。我想如果希望它以0开头,则可以更改let的值。

您的代码无效,因为您过度使用了括号,这使您的代码尝试调用不是过程的“过程”。

您的代码,

(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)))

(方案永远不会像其他语言一样忽略任何括号。)

如果修复这些,

(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)))

并获得相同的结果。

如果只需要一种此类过程,则还可以执行以下操作:

(define flip
  (let ((x 1))
    (lambda ()
      (begin0
        x
        (set! x (- 1 x))))))

测试:

> (flip)
1
> (flip)
0
> (flip)
1
> (flip)
0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM