
计算机科学
文章平均质量分 75
方林博士
计算机软件博士,致力于计算机教育、科研和软件项目开发
展开
-
从傅立叶变换到奥运五环
从极坐标变换的角度给出了傅立叶变换的本质,然后加以利用,从而绘画出了许多不可思议的图形。原创 2024-02-15 02:17:46 · 547 阅读 · 0 评论 -
寥寥几段文字就说清楚了什么是精确度和召回率
学习和研究机器学习、深度学习的人经常会需要对AI模型的效果进行判定,其中最常用到的判定依据是精确度(Precision,又称为准确度、精准度)和召回率(Callback)。到底什么是精确度和召回率?它们的本质区别是什么?本文讨论这些问题。精确度和召回率都是用来判断AI模型预测效果的指标,取值范围都是[0, 1],越接近0表示模型的效果越差,0表示模型全部预测错误;越接近1表示模型的效果越好,1表示全部预测正确。两者的本质区别在于,精确度是针对模型的输出进行计算的,而召回率是针对模型的输入计算的。原创 2021-12-02 12:57:55 · 3976 阅读 · 0 评论 -
从快速排序到求序列中最大的N个数
给定一个无序的序列,求其中最大的N个数,这是一个经常遇到的实际问题。下面,我们先从快速排序说起。我们知道,快速排序的平均排序速度是最快的,其原理就是任取序列中的一个数M,把剩下的数分为两组,一组是大于等于M的数,另一组是小于M的数,显然,在最终的结果中,M应该居于中间位置。接着,对这两组数分别递归地调用快速排序即可。比如,设有无序序列{9, 2, 11,7,5,1,4,6},第一步,任取一个数,比如说5,再按照上述规则把剩下的数分为两组,得:{2,1,4} 5 {9,11,7,6}其中5居于原创 2021-11-25 15:56:22 · 4966 阅读 · 0 评论 -
用遗传算法解决中国邮递员问题
所谓中国邮递员问题,见下面无向图 ,假设邮递员初始位置在A点,现在他要访问所有其他4个结点以便投递邮件,结点与结点之间的距离已经标注在边上。问:邮递员应该依次访问哪些结点才能以最短路径遍历所有结点,并且最后还能回到原点。比如,假设邮递员依次访问ACDEBA,则总路径长度是8+7+7+12+10=44。这里要求路径中每相邻的两个结点之间存在一条边,且起点和终点都是邮递员的起始结点,路径覆盖了邮递员所有能到达的结点。ACEDBA就不是一条合法的路径,因为C和E之间没有边。ACDEBA是一条合法的路.原创 2021-11-08 12:20:13 · 4383 阅读 · 1 评论 -
计算的本质
1. 图灵机据说牛顿在树下被一只苹果砸中,因为想到了万有引力。当20世纪上半叶的数学家们思考关于计算的问题时,小孩子写的如下图所示的乘法算式会不会给他某种提示?图1 一个计算的示例是的,在如今的计算机科学家看来,这样简单的算式的确蕴含了计算的本质。1940年代的图灵为了说明什么是计算的本质,发明了图灵机。图灵机是个抽象的机器,这个机器的下方有一个读写头,读写头可以读写一个纸带,纸带上面有很多字符。读写头可以读取当前字符,也可以把它改写为任意指定的字符。图2 图灵机示例在图灵机..原创 2021-08-30 15:20:16 · 1659 阅读 · 0 评论 -
Python协程及其应用
请看代码片段:def mm(n): result = [] for e in range(n): result.append(e) return resultif __name__=='__main__': for p in mm(100): print(p)这个例子用来输出0~99共100个整数。代码看起来没有任何问题,但是如果把常数100改为1亿,则运行时要过很久才会打印出数据,更重要的是,内存中要准备好1亿个单位空间用来存放这1亿个数。原创 2021-08-27 18:04:22 · 346 阅读 · 0 评论 -
树和树林的实现,不懂数据结构的人也能看懂
树常用来表达一对多的关系,比如企业里从总经理到部门到员工的关系,军队中从军、师、团到营、连、排、班的关系,XML文档中各种文档元素之间的组成关系等等都可以用树表示。下图4给出了树的一个示例:树的一个例子树由结点构成,有一个唯一的结点称为根,包括根在内每个结点可以有0个、1个或者多个子结点,子结点又可以有自己的子结点,依此类推,构成了一个树根在上的倒过来的树形结构。除了根之外,每个结点都有且仅有一个父结点。没有子结点的结点称为叶子。除了根和叶子之外,其他结点称为中间结点。树以及树所构成的集..原创 2021-08-26 14:39:54 · 224 阅读 · 0 评论 -
初学者学习计算机编程有哪些关键技术必须掌握
第一,你必须掌握高等数学的知识,包括微积分、概率论和线性代数。并不是说你学过高等数学之后就一定会在工作中使用它,而是说高等数学是锻炼人的逻辑思维、形象思维的最好工具。比如微分和积分的概念就是人类思想史上的一次大解放,你怎么能错过这样一个从根本上提高思维能力的机会呢?第二,要掌握计算机组成的基本知识,包括数字逻辑,计算机体系结构,二进制,寄存器,堆栈,内存管理,指令,汇编语言等等,了解CPU的结构以及是如何工作的。一句话,就是理解计算的本质。刘慈欣在《三体》里讲了一个故事,一位牛人穿越到秦朝之后,秦始皇给原创 2021-08-24 09:56:09 · 1947 阅读 · 0 评论 -
Python解决最长子串问题
设有两个字符串abaabba和bbbabaa,问它们的最长子串是什么?这个问题的一个应用就是比较两个病毒的基因,从而给出两者的相似度。这里我们用递归方法解决这个难题。输入参数显然是两个字符串s1和s2。递归边界是s1和s2中至少有一个是空字符串[1],此时它们的最大子串就是空字符串。递归假设是只要s1或s2中少了一个字符,则程序总能计算出它们剩余部分的最长子串。递归推导时可以把s1的第一个字符c拎出来单独考虑。如果最长子串中不含有c,则可以递归地求s1的剩余部分与s2的最长子串r1。否则可以针对s2原创 2021-08-24 08:57:50 · 1276 阅读 · 0 评论 -
掰开来揉碎了细细讲解KMP算法,没学过数据结构的人也能懂
大家一定使用过Git或者SVN管理过项目的代码,其中有一个主要功能就是比较代码的异同。编写这样一个程序也许不是太难,难的是参与比较的代码一般都比较长,比较可能需要花很长时间。但是,Git或者SVN都能几乎在一瞬间完成比较,速度之所以这么快是因为它们的基础算法中使用了KMP算法,该算法还在基因序列对比中发挥了重要作用。本文从最本质的角度剖析了KMP算法,帮助大家深刻理解它。1. 字符串的暴力匹配算法字符串匹配是指在一个字符串main上寻找子串sub的过程。比如假设main=‘abcabdebx#HA'原创 2021-08-19 21:50:06 · 888 阅读 · 0 评论 -
传统人工智能中的三大问题
基于神经网络和大样本统计规律的深度学习越来越走入瓶颈,人工智能的发展越来越向基于符号推理和因果推理的传统人工智能回归。AI算法工程师不能把眼光仅仅局限在海量样本的统计规律上,而应该学习并掌握基于符号推理和小样本学习的传统人工智能技术。否则,当深度学习的热点一过,你很可能无法适应企业和市场对AI的新的需求。本文介绍了传统人工智能要解决的三大问题:问题求解、博弈和谓词逻辑。它们都是基于符号推理和白盒推理的。了解相应的解决方案和算法有助于算法工程师开拓眼界,加深对算法本质的理解,增加解决问题、适应未来需求的能原创 2021-08-18 13:19:50 · 4231 阅读 · 0 评论 -
中序遍历及其递归程序非递归化
只要翻开任意一本《数据结构》书,翻到二叉树那一章,你可以看到一个典型的二叉树中序遍历算法形如:代码1: 经典的二叉树中序遍历算法typedef struct _Node { struct _Node *left, *right; char value;} Node;void valueInMiddle(Node *root) { // 中序遍历二叉树 while(1) { while(root != NULL) { push.原创 2021-08-17 18:45:15 · 929 阅读 · 0 评论 -
Python装饰器应用示例
面向侧面的程序设计方法(Aspect Oriented Programming, AOP)是面向对象技术之后流行起来的一种程序设计技术,目的是从模块的侧面对模块的运行进行监督、统计、权限检查异常处理等工作。AOP主要是高级软件工程师在进行系统软件、框架、平台的开发时使用。假设需要对程序员编写的每一个函数进行跟踪,看看哪些函数被调用了,调用时的参数和返回值分别是什么。要实现这个功能有两个方法:第一,让程序员在他/她写的每个函数里增加上述操作。显然这个方法相当麻烦,并且如果想要修改跟踪逻辑,则势必要更改所有原创 2021-08-16 08:37:29 · 388 阅读 · 0 评论 -
深度学习之殇
如今,谈到人工智能,人们第一个想到的是深度学习。大量的人力物力财力被投入到深度学习中去。但事实上,深度学习本质上是对大量样本统计规律的归纳,被称为统计学习。统计学习是AI的初级阶段,统计学习之上还有其他学习,从高到低分别是: 数学归纳法 进化 学习 逻辑推理 经验学习 统计学习 经验学习是什么?经验学习是指基于贝叶斯公式和贝叶斯网络的学习。其本质是用新发生的现象、事实和证据改变人们对事物本质的老的认识。比如,原创 2021-08-12 16:57:27 · 297 阅读 · 0 评论 -
编程是不是只要懂语法就行了?
编程只要懂语法就行了,说这话的不是别人,是90年代我读本科时的一位计算机老师,当时他是名牌大学计算机专业毕业的硕士。这个说法即使是30年后的今天也依然有一定市场。但其实这是一个错误且十分有害的看法,先说它错在哪。程序设计一定要有计算机理论和数学支持,比如要有《数据结构》、《计算机组成》、《人工智能》、《编译原理》、《操作系统》、《软件工程》、《微积分》等方面的知识。有人可能会不服气的说,也有高中生没学过这些知识但照样可以编出功能强大的程序?是吗?我同意的确有非专业的人员从事编程工作也做得很好,这样的原创 2021-08-11 10:04:01 · 403 阅读 · 0 评论 -
递归程序设计方法及其优化,程序设计王冠上的明珠
目录1. 递归的本质2. 河内塔问题2. 兔子问题和斐波那契数列3. 通配符匹配问题4. 排列组合问题5. 人字形铁路问题6. 递归程序优化之一——避免重复递归7. 递归程序优化之二——消除死循环7.1 倒水问题7.2 倒水办法8. 八皇后问题9. 求24点递归程序设计方法(简称递归)是指函数直接或者间接调用自己的现象。递归是一种有趣的程序设计方法,往往区区几行代码就能达到神奇的效果。递归同时是一种非常数学化的方法,其背后有着深刻的数学原理。递归是程序设计原创 2021-08-07 08:45:37 · 2210 阅读 · 0 评论 -
Python3.9全部47个字符串函数的说明
作为脚本语言,Python具有强大的字符串处理能力,下面是Python3.9全部47个字符串函数的说明(函数名中用中括号[]括起来的部分表示可选的语法成分): 函数 说明 示例 1 s.capitalize() 返回s首字母大写的结果 ‘abc'.capitalize()=='Abc' '中国abc'.capitalize()=='中国abc' 2 s.casefold() 返回与s等价的一个字符串以便在忽略原创 2021-08-05 11:41:42 · 304 阅读 · 0 评论 -
二分法和黄金分割法的区别和联系,附Python代码
二分法二分法的本质是求函数y=f(x)在y*处的解x*,使得f(x*)=y*。也就是说二分法的目的是求函数在确定值y*处的解。假设g(x) = f(x) - y*,则有g(x*) = f(x*)-y* = 0,所以求函数在确定值y*处的解等价于求函数在0处的解。设有函数f(x),且有f(a) < 0 和f(b) > 0,则求x*使得f(x*)=0的Python代码如下:def solve_with_binary(func, a, b, epslon=0.0001): """原创 2021-08-03 14:03:00 · 3218 阅读 · 1 评论 -
Python3.9全部73个内置函数说明
以下是Python3.9的常用内置函数和内置变量的说明: 内置函数 说明 示例 1 abs(x) 求x的绝对值 abs(-3.4) == 3.4 2 all(x) 判断中的序列x中的每个元素是否都是True,如果元素也是一个序列,则递归地判断 all([True,True])==True all([True, False])==False all((True,[True]))==True all(((Fal..原创 2021-08-02 17:18:29 · 3269 阅读 · 13 评论 -
计算机内部如何实现递归和函数调用:计算机组成基本知识之二
递归函数和普通函数的本质区别是什么?计算机内部会对递归函数(包括直接递归和间接递归)做特别处理吗?本节回答这些问题。1.计算机组成要想了解计算机怎么实现函数调用和递归,就必须了解计算机的组成。下图给出了计算机组成结构示意图:图1 计算机内部的组成结构示意我们通常所说的CPU其核心就是一个加法器,可以执行二进制加法以及位运算。有两个加法寄存器负责向它提供数据,一个结果寄存器用来保存加法或者位运算的结果。减法、乘法和除法乃至更高级的乘方等等运算都是通过加法来实现的。乘法和乘方运...原创 2021-07-29 09:48:44 · 1324 阅读 · 0 评论 -
Python解决五猴分桃问题
有5只上山去摘桃,一直摘到天黑。5只把所有的桃子放在一起,然后约定第二天一早来分桃。第二天早晨,来了一只猴子。他等了一会后心想:不如干脆我把桃子分了吧。于是他把桃子分成了五等份,分完后发现多了一只桃子。他想:我这么辛苦把桃子分了,这多出的一只桃子理应归我!于是他吃了这只桃子,然后带上一等份桃子,走了!过了一会,第二只猴子来了。他也等了一会。不耐烦之后也把桃子分成了五等份,也发现多一只桃子。他同样吃了那桃子之后也带走了一等份桃子。后来,第三、第四、第五只猴子都是先五等分桃子,然后吃掉多出来的一个桃原创 2021-07-28 11:01:38 · 4237 阅读 · 0 评论 -
为什么C++和Python都支持多继承,Java却不能?
C++和Python都允许一个类继承多个父类而Java却不允许,对这个现象不少人解释说是Java为了简单起见。这个解释不能说错,但流于浅显。事实上Java这样做是不得已而为之。如果强行允许多继承,Java整个系统就会崩溃。单继承如何定位在不同类中定义的成员变量解释这个现象必须从高级语言如何定位对象的成员变量开始。假设obj是类P的对象,存于内存100开始的位置,obj中含有成员变量f1、f2和f3,长度分别是4、2、3。在不考虑其他因素(比如内存字对齐)的情况下,obj在内存中的存储是这样的:1原创 2021-07-27 10:36:09 · 1224 阅读 · 2 评论 -
Python解决数字棒球游戏
数字棒球游戏是这样玩的:先由甲在心里想一个4位数,比如3092,不足4位的以0补足,比如12被认为是0012,这个数被称为目标。乙来猜这个数,方法是这样的,他先随机对甲说一个数,比如5382,甲告诉乙5382里有几个ball几个strike。所谓ball是指5382中有几个数出现在目标中,因为数字3和2都出现过,所以这里有ball=2。所谓strike是指在这2个ball中有几个位置是正确的。比如,上例中数字2的位置正确,所以strike=1。乙随后会进行分析,然后再猜一个数,甲再告诉乙ball和strik原创 2021-07-26 10:11:05 · 911 阅读 · 0 评论 -
Python的可变参数和关键字参数
可变参数强类型面向对象语言如C++和Java都有重载(Overload)机制,允许在同一个类内定义多个同名的函数,只要它们的参数不同(或者参数数量不同,或者对应参数的类型不同)。Python是弱类型语言,所以没有直接实现重载机制,但是却实现了一个更强大的机制:可变参数。下面看例子:def mm1(*a): print(a)mm1(12, 34, 56, 'abc', 'xyz')运行结果是:(12, 34, 56, 'abc', 'xyz')其中*a表示a是一个可变参数,原创 2021-07-25 11:49:33 · 395 阅读 · 0 评论 -
Python和贝叶斯网络:贝叶斯理论(6)
在前面的章节中我们学习了贝叶斯网络的基本知识。本章将利用Python建立如下图所示的贝叶斯网络:在Python中建立贝叶斯网络要引入pgmpy包和pandas包,然后编写如下代码:from pgmpy.models import BayesianModelfrom pgmpy.factors.discrete.CPD import TabularCPDimport pandas as pdm = BayesianModel() # 创建一个贝叶斯网络m.add_edge('爱情'.原创 2021-07-24 16:47:48 · 1272 阅读 · 2 评论 -
Python计算24点:递归程序设计艺术(9)
给定4个1~13之间的数,用任意多的加减乘除和括号计算这4个数,使得最终结果是24,这就是著名的24点问题。本节课的目的是编写一个程序,能够用给定的4个数凑出24。也就是说,让电脑而不是人脑计算24点。这一题看起来难度很大,但是只要坚持递归三步曲问题一样可以解决。首先把原问题分解为两个子问题:1) 4个数能凑出哪些表达式,以及每个表达式的值;2)上述表达式中哪些的值是24。第二个问题好解决。第一个问题可以用一个递归程序解决,首先明确第一个问题的参数是nums,表示当前可以使用的数的列表。注意这里只...原创 2021-07-22 14:11:49 · 681 阅读 · 0 评论 -
Python解决八皇后问题:递归程序设计艺术(8)
上图展示了一个8*8的国际象棋棋盘,八皇后问题就是指在该棋盘上放8个皇后,使得任意两个皇后不在同一行也不在同一列,还不在同一斜线(与水平线呈45。角)或反斜线(与水平线呈135。角)上。换句话说,就是避免任意两个皇后之间对杀,因为国际象棋中皇后可以任意横走、竖走、斜走,且不受长度限制。按照递归三步曲可以解决这个问题。首先明确输入参数是index和points,前者表示当前要考虑的是第几个皇后(从0开始数),后者是一个列表(list),包含了之前的所有皇后的坐标。当前皇后的位置要避免与她们发生冲突。...原创 2021-07-21 11:06:58 · 375 阅读 · 0 评论 -
Python递归优化避免死循环:递归程序设计艺术(7)
递归的第二个问题是死循环。死循环的产生是因为递归假设时,参数并没有向递归边界靠近。下面看一个例子。倒水问题假设有一大一小两个没有刻度的杯子,大小杯子的容量分别是5升和3升。假设可以供给无限量的水,请问用这两个杯子如何倒出4升水出来[1]?程序的参数是a和b分别表示大小杯子中当前的水量。初值都是0。根据递归三步曲,递归边界显然是a== 4 orb== 4[2]。递归假设略。这一题的关键是如何进行递归推导。因为当前参数的状态是(a,b),所以有八种操作可以改变当前状态:综上...原创 2021-07-17 10:50:18 · 1412 阅读 · 0 评论 -
Python递归优化避免重复递归:递归程序设计艺术(6)
如果不加以优化的话,递归很容易出现重复计算的问题。比如前面计算斐波那契数列,根据公式有F(n)= F(n-1)+F(n-2)。这意味着为了计算F(8),必须计算F(7)和F(6)。而为了计算F(7),必须计算F(6)和F(5),......。这里F(6)就被计算了两次。一般地,递归程序越靠近边界,重复计算的次数就会呈指数增加。当求F(36)时,电脑已经完全僵死,没有反应了。那怎么解决这个问题呢?规范的方法是这样的:要保证递归程序除了参数之外没有读写任何外部数据。这是为了保证程序的优化只在程序内...原创 2021-07-17 09:32:45 · 820 阅读 · 0 评论 -
Python求解人字形铁路问题:递归程序设计艺术(5)
如下图,有一段人字形的铁路,火车只能从右边铁路线驶进,并且只能从左边铁路线驶出。驶进来的火车可以停在人字形的上半部分铁路线上,从而让后进来的火车先从左边铁路线驶出。当然它也可以进来之后不作停留直接驶出。假设右边有n列火车,问从左边驶出的n列火车的排列有多少种? 人字形铁路问题:火车只能右边进左边出 比如假设右边有3列火车A、B、C,则从左边驶出的火车的排列只有5种:ABC、ACB、BAC、BCA和CBA。3列火车的所有6种排列里唯有CAB是不可能的。因为C原创 2021-07-16 10:49:04 · 428 阅读 · 0 评论 -
Python求解排列组合:递归程序设计艺术(4)
从5个不同的小球里任取3个的组合有多少?这是一个典型的组合问题,答案是C(5, 2)即10种。但是我们现在并不是要用数学方法求组合的解,而是要求编写一个递归函数comb(m,n)以求得从m个小球里任取n个的组合数,其中m ≥ n始终成立。我们根据递归程序三步曲来考虑这个函数。第一,确定递归边界。在什么情况下,组合数可以直接求得,而不必进行递归?显然当n=0时,不论m等于多少,组合数都是1。把n=0作为递归边界已经足够了。但是,如果还有其他边界则也应该考虑在内,这样有助于程序在递归过程中更快地接近边.原创 2021-07-16 10:00:09 · 708 阅读 · 0 评论 -
Python实现通配符匹配:递归程序设计艺术(3)
如果说上节的兔子问题还可以用非递归的方法实现的话,那么下面这个例子就很难用非递归方法来实现了。假设“*”可以匹配0个或0个以上的字符,“?”可以匹配且仅匹配一个字符。请写一个递归函数match(pattern, str)判断字符串str是否与模式pattern匹配。比如,在操作系统里寻找一个文件时,不必写全文件的名字。可以使用*和?这两个通配符。比如AB*C?.doc表示任何以AB打头,倒数第二个字符是C的doc文档。我们仍然按照递归三部曲来考虑这个问题的解法。第一,确定边界条件。在什么原创 2021-07-16 06:29:12 · 799 阅读 · 2 评论 -
兔子问题和斐波那契数列:递归程序设计艺术(2)
一对刚出生的小白兔两个月后就成熟并生下一对小兔子,之后每个月都能生一对小兔子。刚生下的小兔子过两个月以后也成熟了,也能每个月生一对小兔子,……,以此类推。假设兔子永远不会翘辫子,现在给你一对刚出生的小白兔,问n个月后有几对兔子?显然,输入参数是n。递归边界是n=0或1,此时小兔子还没有出生,所以兔子数目都是1对。递归假设是任意n-1,n-2,......个月的兔子数目都是已知的。当n>2时,每个月的兔子由上个月的兔子和本月新出生的兔子组成。而本月新出生的兔子数与两个月前的兔子总数相同,因为那时原创 2021-07-16 06:20:46 · 324 阅读 · 0 评论 -
Python求解河内塔问题:递归程序设计艺术(1)
递归程序设计方法(简称递归)是指函数直接或者间接调用自己的现象。递归是一种有趣的程序设计方法,往往区区几行代码就能达到神奇的效果。递归同时是一种非常数学化的方法,很多软件工程师用不好递归,原因就在于没有理解递归的本质。递归的本质递归的本质就是数学归纳法。什么是数学归纳法?比如,如果我们要证明前n个奇数的和等于n2,例如:1+3+5=32,1+3+5+7=42,也就是说1+3+……+(2n-1)=n2。那么怎么证明呢?第一步,简称为确定归纳边界。当n=1时看看定理是否成立。当然,定理显然是成立的,原创 2021-07-15 18:05:45 · 420 阅读 · 0 评论 -
补码是什么东东:计算机组成基本知识之一
计算机的核心部件是CPU,CPU的核心是什么?是一个加法器。这个加法器只能执行一种操作,即二进制加法。其他运算都是通过加法实现的。比如说乘法、除法和减法。乘法好理解,可以认为是多个加法和多个移位运算组成的,比如:所以二进制1001与101相乘的结果就是101101。同样地,除法可以用减法表示。那减法呢?减法该怎么计算呢?要想计算减法,首先要明确的一点是:计算机内部一个整数是由有限个bit组成的。这里我们假设一个整数由8个bit组成。这意味着任何超过8位的整数都会被自动截断。也就是说所以.原创 2021-07-14 22:10:25 · 414 阅读 · 0 评论 -
面向对象方法理论学习:为什么Java、C++范型不能继承
先看一个Java范型的例子,设B是A的子类:class A {...}class B extends A {...}则我们可以这样使用范型:import java.util.*;...LinkedList<A> a = new LinkedList<A>();a.add(0, new A());a.add(1, new B());这里范型List<A>定义了一个元素为A的List,所以往这个List添加元素的时候可以添加A类或者A的子孙类对象,所原创 2021-07-11 22:03:34 · 190 阅读 · 0 评论 -
面向对象方法理论学习:重定义的本质
面向对象方法的基本机制有:封装、继承和重定义。封装表示数据和操作被封装在一个类里,继承是子类对父类属性和操作的继承,重定义是子类对父类中某个成员方法的重定义。我们的问题是:重定义的本质是什么?以Python为例,看下面一段代码:打印结果:in Parent.mm()in Child.mm()这个例子给我们这样一个感觉:重定义就是子类在继承父类的方法时,改变了它在父类中的行为。这话没有错误,但是不够深刻,也解释不了重定义为什么存在的原因。如果你仅仅只是想在子类中改变父类对某个方法的缺省.原创 2021-07-11 11:01:12 · 223 阅读 · 0 评论 -
面向对象方法理论学习:子函数可以引用父函数的参数和变量,但为啥不能更改它?
高级语言比如Python和Java一般允许在函数中定义函数,前者称为父函数,后者称为子函数。下面给出了Python的一个例子:程序打印的结果是两个25。这里有三个问题:为什么子函数child()可以引用父函数parent()中的局部变量a和参数,却不能对它们赋值? 为什么child()打印的是25而不是5? 子函数与普通函数有什么本质区别?当编译器在parent()的函数体中遇到对child()的调用时,会把子函数所要引用的所有局部变量或者参数以隐含参数的形式被保存在子函数的的运行记录原创 2021-07-10 11:29:35 · 757 阅读 · 0 评论 -
用Tensorflow算算你的股票由负转正的复合增长率等于多少
日前一位老朋友跟我讲到了他想了很久的一个问题:负数的复合增长率如何计算?先说什么是复合增长率。假设一个数在n个单位时间内从a变成b,增长率就是:假设复合增长率是r,则有:所以:这个公式不难理解。问题是,当a和b的符号不同时,b/a的结果是负的,这个公式显然不适用了。这个问题就是负数增长率如何计算问题。解决这个问题的办法是首先把增长率按照正负两种情况加以考虑,然后再把人工智能深度学习的思想引入进来,利用Tensorflow自动求偏导的功能解决问题。正数的增长公式原创 2021-07-05 10:18:11 · 2846 阅读 · 3 评论 -
Python解决12小球问题
三进制12小球问题就是说有12个一模一样的小球,外表看不出区别,但是其中有且仅有一个小球是坏球,它比其他球可能重一点,也可能轻一点。给你一架天平,请只称三次就找到这个小球。上一篇博客已经说明了解这个问题的手工解,这次我们试图编写一个计算机算法来解决这个问题,难度显然要大多了。解决这个问题之前,我们先来谈谈数的进制。为什么人类习惯使用十进制呢?因为人的两只手恰好有十根手指头,十进制计数方便。如果外星人有八个手指头,那他们极有可能常用的是八进制而不是我们认为理所当然的十进制。计算机中主要使用的是二进制,原创 2021-07-01 15:08:15 · 1544 阅读 · 0 评论