主要内容
多次递归:谢尔宾斯基垫片
到目前为止,我们学过的递归示例要求每次都进行一次递归调用。但有时需要进行多次递归调用。这里有一个很好的例子,被称为谢尔宾斯基垫片的数学结构分形:
如你所见,它是在正方形区域内以特定图案绘制的小方块的集合。这是绘制它的方法。从完整的正方形区域开始,将其分为四个部分,如下所示:
取三个正方形,通过它们 —— 左上角、右上角和右下角 —— 并以相同的方式将它们分成四个部分:
继续。将每个正方形用 × 分成四个部分,并在左上角、右上角和右下角中放置一个 ×,但绝不修改左下角。
一旦方块变得足够小,停止分割。如果你用 × 填充每个方格,并忘记所有其他方格,就会得到谢尔宾斯基垫片。再观察一次:
总而言之,这里是如何在正方形中绘制谢尔宾斯基垫片的方法:
- 确定方块有多小。如果它足够小,可以作为基础案例,那么只需填写正方形即可。您可以选择“足够小”的小。
- 否则,将方块分为左上角、右上角、右下角和左下角。递归地“解决”三个子问题:
- 在左上方的正方形中画一个谢尔宾斯基垫片。
- 在右上方绘制一个谢尔宾斯基垫片。
- 在右下方绘制一个谢尔宾斯基垫片。
请注意,你不仅要进行一次而且要进行三次递归调用。这就是我们考虑绘制谢尔宾斯基垫片以展示多次递归的原因。
您可以选择递归绘制谢尔宾斯基垫圈四个正方形中的任意三个。结果将从上图中旋转90度的某个倍数。(如果你在任何其他数量的正方形中递归绘制谢尔宾斯基垫片,则不会得到有趣的结果。)
下列程序绘制了一个谢尔宾斯基垫片。尝试注释或取消注释一些递归调用以获得旋转垫片: