孩子学习编程3年,今天终于明白编程的终极目标
孩子4年级开始接触编程,一直是零零散散的学着,我也没有着急,主要是想让她保持接触,激发兴趣。
今年小升初大战结束,暑假作业也忙着差不多了,就想让她捡起来继续学着,我问她是不是语法忘的差不多了,她说可能需要复习一下。
于是我给她出了一道题,输入任意两个整数,输出两个数的最大公约数和最小公倍数。
她可能感觉到有一定的挑战性,饶有兴致的开始了,不到5分钟就激动地告诉我,做好了,我没有着急先看她的代码,就问她程序的逻辑是什么?
她说,我是这样实现的:
思路
1,先看两个数谁大谁小
2,然后看大的能不能被小的整除
3,如果能够整除就直接结束,小的就是最大公约数,大的就是最小公倍数
4,如果不能整除,就把大的数翻倍,然后重复第二步
5,这时候如果能够整除的话小的就是最大公约数,大的数翻倍之后就是最小公倍数
6,如果仍然不能整除就认为两个数互为质数,最大公约数为1,最小公倍数是二者的乘积
我笑了,问她这个逻辑是如何得到的?有什么理论依据?
她说这是她自己琢磨的,根据数学课堂的经验得到的。
我说那么你觉得这个可靠吗?
她沉默了。
我趁机给她说了一下编程的秘密:
什么是编程
所谓编程就是利用计算机的特长(计算速度快,准确性高,不知疲倦)来帮助人类完成工作,这样就能够达到提高工作效率,其实就是我们常说的自动化,但是计算机也不是什么事情都能够帮助人类,它只能擅长做有规律的事情,比如有规律的计算,有规律的分析,有规律的比较等等。
这里的关键就是有规律,所以我们为了让计算机帮助我们完成某个事情,最重要的一点就是找出规律,然后用程序实现。
而为了找出规律,就需要首先先去分析你人工或者手动完成这件事情的每一个步骤,而不是想当然的认为计算机就用一种新的逻辑去做。这样就会陷入陷阱。
她似乎明白了什么,开始拿出数学课本,研究起了求最大公约数和最小公倍数的内容。。。
大概20分钟后,她不像一开始那么兴奋激动,比较低调的过来告诉我,程序做好了,而且测试过了。
代码(python):
number1 = input("我可以帮你求出两个数的最小公倍数,请输入第一个数字。\n")
number2 = input("请输入第二个数字。\n")
number1 = int(number1)
number2 = int(number2)
ifnumber1 > number2:
big = number1
small = number2
else:
big = number2
small = number1
whilebig != small:
big -= small
ifsmall > big:
big2 = big
big = small
small = big2
yue = big
bei = number1 * number2 / yue
print("最大公因数是",yue,",最小公倍数是",bei)
我这次仍然没有着急看程序,问她程序的逻辑是什么啊?
她这次显然比较有把握,自信说利用了辗转相减法实现的。
我听了比较高兴,因为数学课学了很多求最大公约数的方法,而其中能够用计算机程序实现的最佳选择有两个,其中一个就是辗转相减法,另外一个自然就是辗转相除法。
我这才去看孩子写的代码,出乎我的意料,她的循环处理编写的非常的棒,而且短时间内能够把规律化解为循环处理我还是很佩服她的,毕竟从来没有给她讲过如何把事物的规律化解为计算机语言程序结构的步骤。
我又告诉她交换small,big其实python有一个简单的写法一步就实现,那就是:
(a,b) = (b,a)
然后趁热打铁,让她实现了辗转相除法的程序:
辗转相除法(PYTHON):
number1 = input("我可以帮你求出两个数的最小公倍数,请输入第一个数字。\n")
number2 = input("请输入第二个数字。\n")
number1 = float(number1)
number2 = float(number2)
if number1 > number2:
big = number1
small = number2
else:
big = number2
small = number1
while small != 0:
big %= small
if small > big:
(small,big)=(big,small)
yue = big
bei = number1 * number2 / yue
print("最大公因数是",yue,",最小公倍数是",bei)
我又问她,求出了最大公约数,你怎么想到利用这个方法求最小公倍数啊,她说我就是寻找两个数以及最大公约数,最小公倍数的关系和规律,想到有这样一个公式:
A * B = AB的最小公倍数 * AB的最大公约数
嗯,果然好像开窍了!
虽然程序还有一些小问题,比如说输入数的排错处理,等等。但是核心逻辑和算法非常的专业。
------------------------多余的话------------------------
我个人其实不喜欢她的程序中的
big %= small
和
big -= small
这样的写法,因为可读性差一些,可能为了显示出自己的高大上,她学了这种写法之后一律这样写计算式。
最后我再次给她总结一下,这次编程的经验:
编程是对现实问题的抽象
写代码之前需要先分析思路
分析思路之前先要分析事物的规律
编程不能改变原来事物的内在逻辑
不是所有事物都能够请计算机帮助实现
总结
我说比如说,给计算机10张图像,它其实不能够看出这个照片是一人像照还是一风景照,或者给它10张人像照,它不能够分辨出来谁是谁,她立刻反驳说现在不是有人脸识别了吗?
很好,的确随着技术的发展现在可以实现了,但是也是最近才实现的,而且还有很多地方不够精准。(我那一刻有点慌乱)
这次编程的过程非常有意义,感觉给孩子一个崭新的认识,让她开窍了,终于明白编程的意义和思路了。
领取专属 10元无门槛券
私享最新 技术干货