【问题标题】:Corecursion Doesn't Terminate After Small ChangeCorecursion 不会在微小的变化后终止
【发布时间】:2016-02-02 19:48:41
【问题描述】:

我在 Racket 中编写了一个函数来生成类似于以下分形的东西。

(define CUT-OFF 5)
(define CIRCLE-MODE "outline")

(define (circle-fractal size colour)
  (local [(define full-circle (circle size CIRCLE-MODE colour))]

    (cond [(<= size CUT-OFF) full-circle]
          [else
           (overlay/align "middle" "middle" 
                          full-circle
                          (beside (circle-fractal (/ size 2) colour)
                                  (circle-fractal (/ size 2) colour)))])))

它通过了我的测试。

我更改了代码,认为下面的代码会更具可读性。

(define (circle-fractal size colour)
  (local [(define full-circle (circle size CIRCLE-MODE colour))
          (define half-circle (circle-fractal (/ size 2) colour))]

    (cond [(<= size CUT-OFF) full-circle]
          [else
           (overlay/align "middle" "middle" 
                          full-circle
                          (beside half-circle half-circle))])))

现在函数不会终止。 Racket 达到其内存限制,没有输出。

在此更改之后,每个核心递归调用是否都不会以某种方式处理微不足道的情况?

【问题讨论】:

    标签: racket fractals corecursion


    【解决方案1】:

    在第一个版本中,(circle-fractal (/ size 2) colour) 仅在 size &gt; CUT-OFF 时才被评估。在第二个中,无论大小如何,它都会被调用。这样你就失去了你的递归基本情况。

    试试:

    (define (circle-fractal size colour)
      (define full-circle (circle size CIRCLE-MODE colour))
      (cond [(<= size CUT-OFF) full-circle]
            [else
             (define half-circle (circle-fractal (/ size 2) colour))
             (overlay/align "middle" "middle" 
                            full-circle
                            (beside half-circle half-circle))]))
    

    【讨论】:

    • 注意:如果您使用的是教学语言,请照常添加local(并记住在以后的问题中指定哪个)。完整的 Racket local 从未使用过 afaik。
    • 谢谢!我正在使用教学语言。下次我会记得指定的。这也是size &lt;= CUT-OFF 只是为了向其他读者澄清。非常感谢。
    • 不客气。关于条件...您的代码在else 子句中,因此当size &lt;= CUT-OFF相反 为真时会对其进行评估。因此,它在size &gt; CUT-OFF 时进行评估。
    • 啊,我明白你的意思了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2015-03-19
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多