If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

多次递归:谢尔宾斯基垫片

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

本内容是 达特茅斯计算机科学 教授 Thomas CormenDevin Balkcom,与可汗学院的计算课程团队合作完成。内容获得许可 CC-BY-NC-SA

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.