大家好!本来上一周应该延续之前的那篇公众号《学编程必先懂数学?》,讨论函数式编程的思想。不过临时插播了《全民一起玩Python 提高篇》的收官感言,所以只好拖到本周继续聊这个有趣的话题。
而就在本文耽搁的一周里,“后浪” 这个词一夜之间成为网络热词,从朋友圈到视频网站,各种观点喧嚣而起、一浪盖过一浪。
视角不同,想法自然也不同。所以杨老师一边吃瓜观浪,一边不自觉想到我们的课程 —— 从学习编程的角度看,该怎样理解这个问题呢?于是把这个词写到VSCode中一遍遍审视,仔细看了半夜,才从字缝里看出字来,满屏都写着两个字:“迭代”。
“迭代” —— “一代更迭一代”。多么准确的一个概念,简直就是为“前浪后浪问题” 量身定制的名词!不信,咱们看看百度百科的定义:“迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次迭代,而每一次迭代得到的结果会作为下一次迭代的初始值。”
看完上面的定义,同学们肯定感觉一头雾水。这次真不怪百度,因为数学的概念总是很抽象。不过只要学过一点程序,无论是VBA还是Python,都会很容易理解这个概念,因为我们已经无数次用过它了,比如:
没错,循环累加就完全符合前面的定义:
(1)首先,它是一个“重复反馈过程”,需要把 s=s+i 这个操作重复100 次,而且每次都要保留计算结果;
(2)其次,它的目的就是为了“逼近目标”,也就是求出“1到100的总和”;
(3)在这个过程中,每一次循环所得到的最新结果(即当前总和),都要记录在变量 s 中,从而作为下一次循环的输入(即用于等号右边的 s+i )。
所以,这个循环累加的过程,就是一个让变量 s “代代更迭” 的过程,是之谓 “迭代” 。
那么它与 “后浪” 又有什么关系呢?这一点不用杨老师讲,何冰老师已经在原版《后浪》中明确的告诉我们了:
“财富”、“积累”、“为你们” …… ,这不就是……
所以,我们已经把 “前浪后浪” 这个社会问题,成功的 “抽象” 为一个计算机模型 —— 迭代累加过程。剩下的,就是发挥我们的想象力,用计算机语言把这个过程的逻辑链描述为代码。
比如:假设每一代人创造的财富是50~100 之间的线性随机数,而消耗的财富是 30~80 之间的随机数,那么留给他下一代的财富就是二者之差。于是可以写成下面Python 代码,用一个函数求取任何一代 “后浪”从 “前浪” 手里得到的 “礼物”。然后两次调用该函数,求得两位第50世代路人的继承数量:
上面的迭代过程,是我们刚学程序设计时就已经掌握的技巧。可以发现,它的特点是“从小到大、从前到后,步步递推”。也就是说:如果想知道第50代人继承了多少财富,就先算第一代人、再算第二代人、再算第三代 …… 直到第49代为止。
然而回到现实中,我们自己真是这样思考的么?恐怕不见得。事实上,很多时候我们是这样想问题的:
什么?你问张三从他老爸那里继承了多少钱?这个简单,只要看看他爸从他爷爷那里继承了多少,然后加上他爸挣的钱就行了。
什么?你问他爸从他爷爷那里继承了多少?这不一样嘛,看看他爷爷从他太爷爷那里继承多少就行了!
什么?你问他爷爷从太爷爷那继承多少?去看看他太爷爷的爸爸给了多少不就知道了吗?就这么点事,烦不烦……
什么?你说一辈辈往上数啥时候是个头?告诉你,祖上50代白手起家,到那一辈就别问了。
这种场景是不是很熟悉?显然,与前面“从前到后”的迭代相比,这种推理过程是从现在开始、向回推导、直到最初一代为止,也就是“层层回归”,简称“递归”。
递归方法的最大优点是:不需要精心设计循环,只要把“继承” 这个反复出现的动作写成一个函数,用 “ 继承(n)” 计算第 n 代从他父辈继承来的财富,就可以把上面这个过程完美的描述为程序代码,也就是下面的样子:
上面代码的核心是 “继承” 这个函数,一句句翻译成人话就是:
第 n 代人继承到的财富:如果 n 是0,那么什么也没有继承到,直接返回0;否则,第 n 代继承的财富就是他的上一代、即第n-1代从父辈那里继承的财富,以及第n-1代自己创造的净财富。
简洁、自然,简直就是前面那段人类对话的直译!这,就是递归的魅力。
就像我们在《提高篇》里讲的:递归是函数式编程的核心和基础,也是解决各种类似 “树形搜索”的复杂问题的妙招之一。所以希望同学们能够仔细品味这个“后浪”的例子,我们下期公众号还会继续介绍递归思想的妙用。
觉得好看就点个在看吧
杨老师课程全集
全民一起玩Python|全民一起VBA
均在网易云课堂发布,欢迎加入、一起进步。
课程地址:%3A//study.163.com/series/1202850603.htm
二维码:
创业/副业必备:
本站已持续更新1W+创业副业顶尖课程,涵盖多个领域。
点击查看详情
评论(0)