最新消息:

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

Python 少儿编程 3418浏览 0评论

友情提示:视频教程观看时请手动设置清晰度。

在接受很多家长的咨询时,我发现家长们有一个误区,总认为孩子们学习编程,Scratch、Python、C++的学习是一个线性递进的过程,即认为小朋友要先学Scratch,然后才能学Python,接着再学C++。我想说,这真的是一个大大的误区。为什么这么说?接下来我从用三种语言分别对同一种算法(二分查找算法)的实现出发,来试图解释一下。

 

今天我用三种语言(Scratch、Python、C++)分别实现了一个二分查找算法,然后通过对这几段代码的讲解,大家也许就能明白这些语言的学习并不是一个线性递进的过程,同时大家也许也能对“孩子学习编程倒底学什么”这个问题,也会有一个比较清晰的认识了。

 (注:为了能让大家有更好地对比性,有一些语言特性相关的细节实现,在我的代码里就略掉了,略掉这些细节特性并不影响程序的整体运行,即这三段代码在各自的环境里都是能正常执行的)。

二分查找算法的整体思路:二分查找算法也叫折半查找,它是为了在有序数组中找到某个数据的改进算法,相比遍历查找(即一个一个比较是否相等的查找方式),它具有平均查找次数少,查找速度更快的优点。二分查找算法就是不断将数组进行对半分割,每次拿中间元素和需要查找的数据进行比较。

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

我们可以参见这三段代码图片中红色框框所示,都有一个binarySearch函数实现,这个代码是二分查找算法的核心代码。

 

  • binarySearch函数构成

函数构成都为:

函数名(binarySearch)+ 函数参数(minIndex,maxIndex,data)。

 

  • 函数整体实现说明

这个代码由四部分组成:

(1)获取中间序号:根据传入参数最小序号(minIndex)和最大序号(maxIndex)找到中间序号(middle);

(2)是否已找到:将数据(data)与中间序号对应的列表值(中间值)进行比较,如果值相等就表示找到了;

(3)是否在前半段:如果比中间值要小,说明在列表的前半段,继续查找;

(4)是否在后半段:如果比中间值要大,说明在列表的后半段,继续查找。

 

  • 细节代码说明

接下来我们分别对这四部分代码,这三种语言的分别实现来做一个对比说明:

(1)获取中间序号的代码实现

Scratch

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

Python

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

C++

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

 

代码说明:根据传入参数minIndex、maxIndex,获取到他们的中间序号middle。我们可以看到,很明显虽然他们的书写规范各有不同,但是核心都一样,minIndex和maxIndex相加后再除以2,得到中间值,接着还要调用floor(即向下取整)获取到中间序号,赋值给middle,因为序号不可能为小数,所以我们需要取整。

(2)是否已找到的代码实现

Scratch

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

Python

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

C++

知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗

 

代码说明:条件判断列表中间项(Python和C++都表达为list[middle],Scratch表达为知识星球 | Scratch、Python、C++,三者是递进式学习的语言吗)是否等于data,这里的“等于”表达式,Scratch与Python和C++有些许不同,在Python和C++中为==(两个等于号),而Scratch中为=(一个等于号),这是因为在Python和C++中=(一个等于号)表示为赋值语句,当然Scratch中也有赋值积木块的,只是它不是用=(一个等于号)来表达的。

如果判断为真,那么我们用一条输出语句输出“我们已经找到了这个数据在列表的第几项”。

 

同理第三部分代码和第四部分代码我们可以看到他们的结构完全一致,我们不再一一细说。

  • 代码算法说明

我们看到,同一种算法,三种语言的实现,关于算法的实现结构,他们几乎完全一样。在二分查找算法实现里,有一个很重要的编程算法——“递归”。递归,即一个过程(或函数)直接或间接调用自己本身。我们可以看到,在binarySerach函数里,当发现数据在前半段或者后半段的时候,我们缩小序号范围,调用了binarySearch再继续查找。这个实现就是递归实现。

整个代码里至于其它的循环、条件判断、列表赋值取值等等,我们也都可以看到他们的实现如出一辙。

经过上面对二分查找算法,三种语言实现的分解说明,相信家长们都已看到了在这个实现里,每种语言的编程思想完全相同,它们的不同点在于他们的输入方式、输入格式的不同。但为什么我们会建议孩子从Scratch开始学习编程呢,这是因为Scratch的输入方式更适合孩子们的特性

(1) Scratch通过积木块的拖拽拼搭完成程序语言的编写,这是对应于孩子们对于具象化的图形更为敏感的年龄特点。

(2) 同时积木块的输入方式,也可以避免孩子们因为一些小错误导致整个程序出错(如:C++中如果printf少输了一个字母f,程序就编译通不过了),可以让孩子聚焦于他们的创意实现,减小因这些细节错误加大编程入门门槛。

(3) Scratch有中文版和英文版,而代码式编程语言,只有英文输入,所以对于我们母语为非英语的孩子们来说,输入英文对于他们来说,也是一个门槛。

综上所述,所以如果孩子已经具备了相应的英文水平也过了具象化图形思维的年龄阶段,我们是完全可以让孩子直接进入Python和C++的学习的。至于C++和Python的语言选择,那完全是根据孩子们的兴趣方向来决定我们需要选择哪一个语言来学习。简单点来说,如果孩子想更倾向于创意性应用的实现,建议学习Python,如果想更多地了解计算机原理及其底层系统,建议学习C++。

始发于微信公众号:
硅码少儿编程

您必须 登录 才能发表评论!