初赛必考递归题-与半圆有关的话题-答案A

初赛的末道递归题像是一个“优秀人才筛选器”,凡能理解并能作出正确答案的未来大概率能够成为非常优秀的人才。在数学中,几何图形的思维深度要比小学的数学算术高出三个维度。数字50在算术中可以加减乘除,但是画一条长50的线段,其实里面还蕴藏着另外3个维度的数据:线段的起点坐标在哪里:SETXY,线段的指向是哪个角度:SETH。正因为如此,“几何”这门数学总要比其他的数学难一些。所以这道画半圆的LOGO作图题——里面还包含着递归运算,必须要有高超的空间想象能力才能理解之。现在先回顾一下A问题:
========================================
根据下列程序,画出或完善递归图形(A~B每题4分)8%
to
halfball
arc 180
50
fd
50 bk 100 fd
50
end
to dg :x
if :x=1
[stop]
halfball
fd 50 rt
90
dg :x-1
lt 90 bk
100 lt 90
dg :x-1
rt 90 fd
50
end
A.画出执行 cs dg 3
命令的递归图形(大小比例相对准确,请用小三角形标出海龟起点位置)。
请在答案卷相应位置上画出该递归图形,并标出海龟位置
【A】
=======================================
题目中有一个基础的画图零件“半圆”halfball
:

这个 arc 180
50 画出的是180度半径50的圆弧。因为是180度,所以成为半圆。十分关键的是 arc 命令定义的是从海龟当前方向的 6:00 位置开始顺时针画圆弧。如果你不掌握这些要素,后面的一切就免谈了。
接着的 fd 50
bk 100 fd 50
是画半圆的直径并回到原来的起点。
所以 halfball 是一个产生“半圆”的机器。
后面的 dg
过程是一个二重中间递归。用一般的数学思维理解“二重中间递归”是极为困难的。近二十年前林老师发展出出“递归原理图”,可以直观地解释破解所有这一类递归图形形成的机理。所涉及的内容太多,想学LOGO编程的应潜下心来看懂林老师编著的教材中的以下章节:
********************************
《新编PCLogo教程》
第三章《功能强大的递归》第二节《破解“二叉树”的奥秘》P115~
第三节《无限自我相似的“分形”世界》~P143
********************************
《MSWLogo讲义Plus》
第4章《理解递归运算》
第5章《进入奇妙的分形世界》
********************************
这些基本功课是躲不开的。如果你只是为了应付竞赛,这样的题目可以放弃掉,你将来就没有成为编程熟手、高手的可能。你还有通过竞争保送清北的机率吗。
to dg :x
;画:X级半圆的递归
if :x=1 [stop]
halfball
;所有的半圆都是这一行命令画的
fd 50
rt 90
;移动到B点并转向向右
关键!
dg :x-1
;画下一级半圆 上面的那一个
lt 90
bk 100 lt 90
;转回来从B移动到C并转向向左
关键!
dg :x-1
;画下一级半圆 下面的那一个
rt 90
fd 50 ;这一步极为重要,回归起始点 回归起始朝向
end


这个递归程序的奇特之处是递归停止条件 if
:X=1 [ stop
]。
所以执行 dg 1 时不输出图形。
执行 dg 2 时输出一个半圆。
执行 dg 3
时输出:

我们说这是 LOGO语言。中文不也是语言吗?
能用中文来叙述上面题目给出的程序吗?当然可以!转述成中文是如下一段话:
画一个朝左侧的带有直径的半圆。在满足递归的条件时,继续在前一级半圆的直径的两端,在垂直于直径的方向上朝外继续画下一级相同大小的半圆。
这篇博客加上前面说到的《新编PCLogo教程》、《MSWLogo讲义Plus》的相关章节,才是这个题目的完整的解说。
你听到过这样不遗漏一点点细节的讲课吗?你的老师是这样深入地剖析这道难题吗?
哎呀呀!这个“半圆递归”还只是那么多张初赛试卷末道递归题中最简单的一道题!!!
在编程语言中,REPEAT-FOR循环是高于四则运算的数学思维;递归是更高一级的思维。在PYTHON等新型编程语言中,Class类编程(即面向对象的编程)是再高一级的编程思维。有兴趣“步步高”般地学习编程新思维吗?!
待续
更精彩的答案B……
LOGO编程画出的动画:
加载中,请稍候......