《Patrick’s Parabox》,之前因其新颖机制而备受关注。
作为一款主打『套娃』的推箱子游戏,玩家需兼顾一大一小两个场景,传统推箱子里封闭的道路也许反而成为了解题的关键。
图像某部分与整体极为类似乃至相同,这样视觉上的套娃,有个正式的学名叫做德罗斯特效应(Droste effect)。
这个效应得名于荷兰巧克力厂商德罗斯特,使用了数十年而家喻户晓的广告宣传画。
专栏作家尼科在七十年代起率先使用德罗斯特效应这一说法。其实这样奇妙的制图方式,最早可以追溯至公元一千三百多年的祭坛画,其内涵也是『递归』。
递归是计算机逻辑中,程序直接或间接自我调用的情况。其实早在高中乃至初中的时候,大家就曾接触过这个数学概念——比如,“if..else”的条件语句,但也许过于简单与送分估计大家都忘了罢……比如函数f(x)=f(x-1),它永远都无法抵达运算完毕的真实。
但递归是与死循环有本质区别的,有递推必须有个头来归。
通过设置边界条件,这是接;让运算终止前进,无限循环转为有穷计算,这是化;最终反馈计算结果,这是发。
递归是一种重要的编程技巧,它通过将大型的复杂问题,转化为一个又一个同类型的小问题,不断循环,可谓集中一点登峰造极。
编码上,凡是涉及某段代码的重复执行,均可称之为循环。
递归有位同门师兄弟,经常拿来与之比较,那就是,迭代。它们理论上,所有的递归都可以用迭代来代替,反之亦然。迭代也同样是个通过循环,化整为零的技巧,但不同的是在每一部独立运算中都会生成一个结果并代入到下一步骤中。
递归每次调用自身时,虽然并不输出新的值,但也同样需要一个『栈』来作前进与返回的节点。
栈可以类比为一个书架,常理下,书架放书肯定是将书脊朝外,方便日后快速取阅。但栈非要将书本摞起来,从上往下进行堆放或者取出。
严格定义上,栈是指限定仅在表尾进行插入和删除操作的线性表。
往日里咱们熟悉的『撤销』与『恢复』,数据的来去之间,就是靠栈来实现。递归中,每重复调用一次函数都会增加一层栈帧,回归则减少一层。
虽然这样笨『哔』的存取方式,不仅牺牲了速度,占用的内存也比迭代要大,并且递归若是次数过大还有可能因反复调用导致栈的溢出···
哦,是这么回事。有得必有失,递归自然也有迭代循环不及的独到之处。
它能够完成一些结束条件模糊的任务,比如遍历文件夹。把一个镇子上所有的活物揍一遍——镇子指硬盘,活物指文件——对于迭代,代码的编写就要麻烦得多。
那也就是说,楞写,其实也是能做到滴——经典愣头青.大司马jpg。
递归与迭代作为两种典型,对应着两种重要编程范式,分别是声明式编程与命令式编程。
前者重于让计算机明确目标,让计算机在所给定得范围内,自己发挥聪明才智。
计算机从哪里看烟花,从下面看从侧面看?用电子望远镜远程看还是自己体内模拟一遍试试看?只有计算机自己知道。
而命令式编程,则是详细的给计算机行为布置指令,使之严格执行。没跟我说需要先倒水,我当场渴死在水壶边。这样严谨的态度,使得几乎所有的计算机硬件都采用命令式的设计。
所以外设顶多不合你心意,没有不合你实力的——菜是自己的问题,不要怪外设。许多职业哥都是网吧赛用批发外设发家的···咳咳扯远了。
除去计算机,其实递归和迭代也都作为一种哲学蕴含于生活中。因为递归的反复调用自身的性质,实际数学问题的计算上,比如兔子繁殖问题的斐波那契数列,或是汉诺塔的移动次数问题。
这些庞大而复杂的无穷问题——复杂到我觉得可以单开一个视频讲解——都可以用递归法总结出一个通项公式,并仅需计算几步即可。
但迭代循环会生成中间产物,也并非只是累赘。我们常说,产品迭代或是版本迭代。对于大型产品的开发,阶段性的生成雏形并反馈,无论是边盈利边开发,或是促进甲乙方沟通都是不错的选择。
如果搞产品递归,那可能得到的只是无尽的会议记录本,一直在纸上空谈,那就得不偿失了。
故事创作上,从前有座山,山里有座庙……这个太捞了,但也是最经典的模板。
《盗梦空间》中,主角团设计了三层梦境,需要顺次进入与返回,就是一种递归的体现。
《刺杀据点》则是迭代。这部电影讲述的是一次总统演讲活动上的枪击与爆炸事件,通过不断回溯时间,用不同人的视角生成一段画面,最终达到全面而又细节到位的叙事效果。可以说是群像小说与水稿费的绝佳典范——超小声bb。但总的来说真的是一部很棒的电影~
图形学上,这样视觉上的套娃,正式的学名叫做德罗斯特效应。这个大家拖到开头反复观看直到理解即可。但记得不要看太多次,以免栈(指脑容量或者你的流量)溢出而崩溃哦。
或者点开B站给个三连,和梗多沙雕表情包的“玩整版”视频相见~
评论区
共 3 条评论热门最新