欢迎光临
我们一直在努力

Scratch第十七讲:递归的应用-雪花曲线

———— / 废话连篇 / ————

CC哥经常看到一些针对Scratch的培训,包括网上视频,书籍,有写几个小时学会scratch的,有些三天掌握的,反正就是速成。国人就喜欢速成,喜欢走捷径,花最小的代价获得最大的回报。但是CC哥劝大家,编程不能这样,编程是慢工出细活。如同艺术品一样,任何一个小的作品都可以做到极致。大家看下面这个例子,这个时钟做得非常精美,不论是指针时钟还是数字时钟,算法并不复杂,但是却是花了细功夫去做的。下次有机会,CC哥会把它作为一个例子跟大家一起来鉴赏一下。

所以那些到处喊着三天包你学会编程的人,就象对你大喊,三天包你成为毕加索,三天让你成为莫扎特一样可笑。毕加索和莫扎特是靠学习班学会的吗?肯定不是。所以如果你真的对编程感兴趣,没有捷径,编程是不能通过学习班来掌握的,编程需要自己花大量的时间去阅读别人的范例,去大量的练习,并多与高手交流才能精通的。

———— / 正式开讲 / ————

上面说的都是题外话了。今天CC哥从之前一直讲技巧,今天跳到算法上,跟大家聊一下算法。

其实编程主要就两个难点,一个是技巧,一个是算法。技巧就是碰到了问题如何有巧妙地办法去处理,之前有讲过碰撞处理,光一个碰撞就有好多学问和技巧。还讲过按键的技巧,如何解决按键的干扰,如何解决长按的问题。这些都是技巧。那算法呢?之前有讲过怎么用scratch来画圆,那就是算法。包括跳跃重力因素,也是算法。今天CC哥就算法再讲一个稍微深入点的例子:递归。

一听递归俩字,不但小朋友蒙圈了,连大人也蒙了,这俩字似曾相识呀,就像多年前的老同学一样,印象里是有这么个人,但是叫什么名字长什么样呢?真想不起来了。

但是如果我说循环呢?这连小朋友都马上知道了,否则前面的课都白看了。其实递归跟循环差不多,就是不断的调用自己,直到某个条件不成立。而循环就是不断的执行一段特定代码,直到某个条件不成立。

CC哥其实觉得最大的区别就是一个好理解,一个不好理解,递归不好理解,脑子都绕疼了,不信你站到两个镜子中间,马上发现镜子里有无数个自己,一层套一层,立马就有晕眩地感觉。在编程里的区别就是一个代码简单,一个复杂。很多问题是适合用递归解决的而并不适合用循环,但是CC哥仍然建议,如果问题能用循环解决,还是用循环吧,因为递归实在有点绕。

递归就是在过程或函数里调用自身;使用递归策略时要注意的几个条件

1、必须有一个明确的递归结束条件,称为递归出口。

2、递归需要有边界条件、递归前进段和递归返回段。

3、当边界条件不满足时,递归前进。当边界条件满足时,递归返回。

好难理解,看图看图

好喜欢阿汤哥的盗梦空间

理解了没:没理解,后面还有迭代,遍历,都是循环的一种模式。这个以后再讲。

现在让我们看一个scratch的例子,很简单的,让我们看一下。

是不是一口血快喷出来了,这个简单的例子小朋友分分钟就能做出来。 嘿嘿,CC哥也有点小尴尬。

用循环解决倒计时

我们今天讲递归,虽然是这个简单的程序,我们还是要用递归来编程才行。换个思维方式,换成递归的思维:10的倒计时就是9的倒计时再多一秒,9的倒计时就是8的倒计时再多一秒,最后直到0就不用再倒计时了。这就是递归思维。让我们看看代码怎么写:

用递归来设计倒计时

这段代码,就是用刚才的递归逻辑做的。是不是也很简单?可能大家觉得还是循环简单,那是因为这个倒计时的任务简单,那下面CC哥就进入今天的正题,雪花曲线,然后大家看看雪花曲线,你还能用循环写出来吗?

·  知  ·  识  ·  来  ·  啦  ·

如果说有一种平面图形,它的面积是有限的而周长却是无限的,你相信吗?“雪花曲线”就是这样。那么,什么是“雪花曲线”呢?

“雪花曲线”是从一个等边三角形(如图)开始,一步一步作出来的。

第一步:把等边三角形的各边三等分,从每条边三等分后的中段,向外作小等边三角形,再去掉与原来等边三角形重叠的边(如图)

为了便于叙述,以后把这个过程简称为“变化”。

第二步:对上一步得到的小等边三角形,重复上面的变化(如图)

第三步:再对上一步得到的小等边三角形,重复上面的变化(如图)

第四步:再对上一步得到的小等边三角形,重复上面的变化(如图)

第五步、第六步……照这样一直进行下去,就得到“雪花曲线”。

那编程逻辑和算法怎么设计呢?

由于雪花曲线是从三角行不断变换得到,因此我们绘制雪花曲线之需要关注一条边的变化规律即可,想办法画出来,另外两条边都是完全一样的。下面我们从0级开始,看看这个三角形底边是如何一级一级发生变化的。

从三角形最下面一条边开始画:

0级别就是画一条直线了。

1级:0级(1/3长度)右转60度  0级(1/3长度)左转120度 0级(1/3长度)右转60度 0级(1/3长度)

2级:1级(1/3长度)右转60度 1级(1/3长度) 左转120度 1级(1/3长度) 右转60度 1级(1/3长度)

3级:2级(1/3长度)右转60度 2级(1/3长度) 左转120度 2级(1/3长度) 右转60度 2级(1/3长度)

以此类推

4级:3级(1/3长度)右转60度 3级(1/3长度) 左转120度 3级(1/3长度) 右转60度 3级(1/3长度)

n级:n-1级(1/3长度)右转60度 n-1级(1/3长度) 左转120度 n-1级(1/3长度) 右转60度 n-1级(1/3长度)

·  代  ·  码  ·  来  ·  啦  ·

来看一下代码吧:

创建新的积木之前已经讲过了,递归函数,既然是函数,那肯定用一个新积木来做啦,设定两个参数,级数和边长。代码如下:

雪花图形一条边的代码

务必将新积木属性中的“运行时不刷新屏幕”的选项选中,否则你一旦为了好玩把级数设高了,那系统可要死机的。

主程序CC哥就不用讲了,就是调用画边的积木画三条边就好了。

·  运  ·  行  ·  效  ·  果  ·

让我们看看运行效果:

是不是很神奇,有没有感觉用递归函数来画这个雪花曲线超简单,但就是不好理解。不过CC哥今天已经深入浅出的帮大家认真把递归讲了一遍,应该搞懂了吧。

超乎想象的使用体验

赞(18)
分享到: 更多

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址