【问题标题】:Flip function in SchemeScheme中的翻转功能
【发布时间】:2017-03-30 23:14:38
【问题描述】:

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

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

【问题讨论】:

  • 你试过什么?请发布一些示例数据/代码/输出,并告诉我们什么不适合您。另外,请查看此链接:stackoverflow.com/help/mcve。
  • 我试过这个,但它似乎不起作用: (define (make-flip) (let ((x 1)) (lambda ()( (set!x (- 1 x)) (如果 (= x 0) (1) (0)) ))))

标签: function scheme


【解决方案1】:

如果你只需要一个这样的程序,你也可以这样做:

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

测试:

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

【讨论】:

    【解决方案2】:

    您的代码不起作用,因为您过度使用括号,这会使您的代码尝试调用不是过程的“过程”。

    您的代码,

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

    并得到相同的结果。

    【讨论】:

      【解决方案3】:

      你没有说你是如何调用你的函数的。您是否将某个命名函数定义为与您一起返回的 lambda make-flip 函数?我想这是“关闭 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 中的值。

      【讨论】:

        猜你喜欢
        • 2014-03-08
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多