在球拍中通过循环追加的正确方法是什么?

ಠ_ಠ*_*ಠ_ಠ 3 loops racket

今天开始学习球拍.我试图找到通过循环追加的正确方法,但无法找到答案或自己弄清楚语法.

例如,如果我想使用hc-append一行九个圆圈,如何在不手动输入九个嵌套的hc-append过程的情况下执行此操作?

Rod*_*eas 8

你需要意识到的第一件事是,在Racket中"循环"实际上只是递归.在这种情况下,您希望将一堆绘图调用链接在一起.如果我们写出来,我们的目标是:

(hc-append (circle 10) 
    (hc-append (circle 10)
        (hc-append (circle 10)
            (hc-append (circle 10)
                (hc-append (circle 10)
                    (hc-append (circle 10)
                        (hc-append (circle 10)
                            (hc-append (circle 10)
                                (hc-append (circle 10))))))))))
Run Code Online (Sandbox Code Playgroud)

我假设我们所有的圈子都是相同的半径.

现在,既然我们要编写一个递归方法,我们需要考虑我们的基本情况.我们想要绘制九个圆圈.我们称之为最大圆圈数max.我们的基本情况,当我们突破我们的"循环"时,将是我们到达max迭代时,或何时(= iterations max).

现在为递归本身.我们已经知道我们需要传递至少两个变量,当前迭代iterations和最大迭代max.如果你看一下上面的代码,你会发现所有"循环"中的重复元素都是(circle 10).现在有很多方法可以传递它 - 有些人会选择仅仅通过半径 - 但我认为最简单的方法是传递圆圈的图形.

最后,我们还要传递到目前为止我们所做的图片.也就是说,当我们向我们的链附加一个圆圈时,我们需要将它传递回递归方法,以便我们可以继续追加.

现在我们已经得到了平方,我们可以定义递归方法的结构,我们将调用它circle-chain-recursive:

(define (circle-chain-recursive iteration max crcle output)
    ; body here
)
Run Code Online (Sandbox Code Playgroud)

我们方法的"胆量"将是一个if.如果我们已达到最大迭代次数,则返回输出.否则追加另一个圆圈,递增iteration,然后再次调用该方法.

(define (circle-chain-recursive iteration max crcle output)
  (if (= iteration max) 
      output
      (circle-chain-recursive
        (+ 1 iteration) max crcle (hc-append crcle output))))
Run Code Online (Sandbox Code Playgroud)

我个人不喜欢直接调用这样的递归循环方法,所以我会编写一个这样的辅助方法:

(define (circle-chain num radius)
  (circle-chain-recursive 0 num (circle radius) (circle 0)))
Run Code Online (Sandbox Code Playgroud)

现在,如果我想要一系列10个半径为10的圆圈,我所要做的就是打电话(circle-chain 9 10).

你会注意到我(circle 0)像调用的参数那样传递output.这是因为该hc-append方法需要pict参数.由于我们没有开始使用任何圆圈,因此我将其传递给相当于"空白"或无效的图像.可能还有其他一些传递"空白"图片的方法,但我不太熟悉slideshow/pict图书馆来了解它.

我希望稍微澄清一下.