recursion - Postscript中通过递归的分形Pifagor树
问题描述
我正在尝试通过递归在 PostScript 中实现绘制 Pifagor 的树,但是出了点问题 - 我的每个三角形的右导管没有绘制,所以我的右侧部分是空的。我究竟做错了什么?这是代码:
newpath
300 300 moveto
size 0 rlineto
/tree{
1 sub /n exch def
n 0 le { 1}
{
/size exch def %takes size from past stroke(for this case it is number 90 in row №18)
0 size rlineto
size -1 mul 0 rlineto
0 size -1 mul rlineto
0 size rlineto
45 rotate
/size size 2 sqrt mul 0.5 mul def
size 0 rlineto
size n tree
270 rotate
size 0 rlineto
size n tree
}ifelse
} def
90 31 tree %size of square's side, number of iterations
stroke showpage
解决方案
好吧,您的程序在第 3 行定义它之前使用了“大小”,因此它会在绘制任何内容之前立即抛出一个“未定义”错误。我通过将其更改为 90 来解决此问题:
newpath
300 300 moveto
size 0 rlineto
您的程序首先绘制树的左侧,通过“树”递归。然后它后退一个级别并在每个级别绘制匹配的右侧,再次根据需要递归。
但是在我们下降到最小的物体之后,尺寸被定义为一个很小的数字,所以画了另一边,小到你看不到它。
您似乎试图将 PostScript 字典条目视为 C 函数中的局部变量,但 PostScript 不能那样工作。没有变量,只有字典及其内容。
您的代码在当前字典中定义 /n 和 /size。然后它再次调用'tree',重新定义当前字典中的/n和/size等等。
您可能希望将它们留在堆栈中,而不是在当前字典中定义 n 和 size。这确实意味着,如果递归足够深,您将收到 stackoverflow 错误,但最终使用任何语言都会遇到这种情况。
请注意,您当前的程序不会保持堆栈不变,如果 n 小于或等于零,您不会从堆栈中弹出“大小”,而是将“1”压入堆栈。所以你也必须解决这个问题。
推荐阅读
- hyperledger-fabric - Hyperledger Fabric - 查询区块链上的新交易
- c# - 添加到自动加载的程序不启动 C#
- java - SELECT 中的子查询可以返回多行吗?
- asp.net - 可以在 asp.net 项目之上使用 react 路由器从外部访问路径
- c++ - C++ 将十六进制字符串表示形式转换为十六进制
- python - 从 jinja 模板中恢复值
- python-3.x - 尝试使用 Bokeh 绘制 TimeSlider 地图时出现内存问题
- javascript - 如何映射这个json?
- javascript - 如何将特定的 div 放在其他 div 之前?
- for-loop - 调用不匹配...... lambda 函数和 for_each() 出现一些错误