gpt4 book ai didi

loops - 在 Racket 中通过循环附加的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-01 07:15:10 27 4
gpt4 key购买 nike

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

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

最佳答案

您需要意识到的第一件事是,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))))))))))

我假设我们所有的圆都将具有相同的半径。

现在,由于我们要编写递归方法,我们需要考虑我们的基本情况。我们想要画九个圆圈。让我们称之为最大圈数 max .我们的基本情况,当我们跳出我们的“循环”将是当我们到达 max 时迭代,或当 (= iterations max) .

现在是递归本身。我们已经知道我们需要传入至少两个变量,当前迭代 iterations ,以及最大迭代 max .如果您查看上面的代码,您会注意到所有“循环”中的重复元素是 (circle 10) .现在有很多方法可以传递它——例如,有些人会选择只传递半径——但我认为最简单的方法是传递圆圈的图片。

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

现在我们已经得到了平方,我们可以定义递归方法的结构,我们将其称为 circle-chain-recursive :
(define (circle-chain-recursive iteration max crcle output)
; body here
)

我们方法的“胆量”将是 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))))

我个人不喜欢直接调用这样的递归循环方法,所以我会写一个这样的辅助方法:
(define (circle-chain num radius)
(circle-chain-recursive 0 num (circle radius) (circle 0)))

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

你会注意到我通过了 (circle 0)就像名为 output 的参数一样.这是因为 hc-append方法需要一个 pict范围。因为我们没有从任何圆圈开始,所以我传递了它相当于一个“空白”或零图片。可能还有其他一些传递“空白”图片的方法,但我对 slideshow/pict 不太熟悉。图书馆知道它。

我希望能把它弄清楚一点。

关于loops - 在 Racket 中通过循环附加的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11660230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com