公众号原创书籍
MyXieZhiXin
互联网的一个打工人,欢迎关注我的个人微信公众号:程序员Hotel
展开
-
更多数学趣题:走迷宫
===》点我返回目录《===我们都走过迷宫,在弯弯曲曲的小道上寻找出口,迷茫中夹带惊喜。刚开头都是乱走,碰到死胡同后又折回来,慢慢地有了一套办法,确保不遗漏可能的路径,还有些人知道使用左手/右手法则。我们用程序来走走迷宫。我们这儿定义的迷宫是简单形式的,一个N*N矩形,四周有外墙,有一个入口,一个出口,保证有解,可以走的范围从[0,0]到[N-1,N-1],假定[0,0]为入口,[N-1,N-1]为出口。计算机里面,我们可以采用不遗漏可能路径的办法,就是深度优先搜索。作为预备知识,先介绍一下深度原创 2020-07-01 11:01:37 · 1297 阅读 · 0 评论 -
更多数学趣题:Hanoi塔
===》点我返回目录《===印度有个古老传说:在世界的中心贝拿勒斯的神庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上穿好了由大到小的64片金片,这就是汉诺塔。不论白天黑夜,一群沉默的僧侣在移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消失。我们仔细看上面的步骤,会发现一个关键点,就是对三个盘片来讲,就是要先想方设法让上面的两个整体移动到中间柱子,剩下的大.原创 2020-07-01 10:58:04 · 863 阅读 · 0 评论 -
更多数学趣题:Pascal/杨辉三角
===》点我返回目录《===Pascal/杨辉三角型如下:或者是中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现了这个三角。Pascal帕斯卡在1654年发现这一规律(13岁时发现的),所以这个表又叫做Pascal三角。它的特点是下面一行的数字由上面一行的数字两两相加而来(从上图等腰三角形看得很清楚。)既然知道了这个特点,我们程序思路就有了,通过前一行算后一行,用循环即可以做到。我们可以先提炼出一个函数,根据上一行得出下一行:def calculaterow(n,las原创 2020-07-01 10:51:24 · 578 阅读 · 0 评论 -
更多数学趣题:Fibonacci斐波拉契数列
===》点我返回目录《===现在世人皆知的Fibonacci斐波拉契数列最早来源于兔子繁殖问题,大约在800年前由Fibonacci引入(他的另一大贡献是引入了阿拉伯数字)。说的是假定兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?对一对新生的兔子,我们看一下怎么繁殖的:第一个月兔子没有繁殖能力,所以还是一对;第二个月兔子还是没有繁殖能力,所以还是一对;第三个月兔子生下一对小兔,有了两对;第四个月兔子又生下一对小原创 2020-07-01 10:47:06 · 528 阅读 · 0 评论 -
更多数学趣题:求质数
===》点我返回目录《===质素也叫素数,只能被自己和1整除,它们是数的骨架,由他们组合可以生成别的数。它们是人类最着迷的数字,自古就吸引了无数学者学生。古代的人们就知道素数有无穷多个,这一点被欧几里得所证明。而伟大的数学家欧拉靠心算算出了232-1是一个素数。(欧几里得,公元前325年-公元前265年,维基百科)我们现在就编程序判断一个数是不是素数。基本的思路就是从2开始一个一个算能否被n整除,如果可以被整除,就说明不是素数。如果我们动一下脑筋,就会看出不需要算到n,因为很明.原创 2020-06-10 14:24:14 · 587 阅读 · 0 评论 -
更多数学趣题:求对数
===》点我返回目录《===在数学中,对数是对求幂的逆运算,如果a的x次方等于N,那么数x叫做以a为底N的对数(logarithm),记作x=logaN。这是我们现代人的理解方式,而从历史上,其实不是这样的。1614年John Napier提出了对数,而指数是才后来发明出来的概念,欧拉1770年写道“对数源于指数”。历史上对数是为了简化计算,将乘除化为加减,将乘方开方化为乘除。为什么对数能简化运算?这源自对数的一个独特的特性:log(ab)=log(a)+log(b).例如,我们计算1234原创 2020-06-10 14:11:14 · 879 阅读 · 0 评论 -
编程基础概念:分治
===》点我返回目录《===当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。基本的步骤为:分而治之,把一个复杂的问题分解成很多规模较小的子问题,然后解决这些子问题,把解决的子问原创 2020-06-09 15:31:34 · 395 阅读 · 0 评论 -
编程基础概念:算法及性能分析
===》点我返回目录《===算法是计算机上的一系列操作,每个算法都需要占用计算机的计算资源,我们要衡量算法的时间复杂度和空间占用情况。时间复杂度,我们一般用大O表示,我们会看三个指标:最坏情况下的时间复杂度;平均时间复杂度;最好情况下时间复杂度。常数阶:O(1)对数阶:O(log2n)线性阶:O(n)线性对数阶:O(nlog2n)平方阶:O(n²)立方阶:O(n³)指数阶:O(2^n)阶乘:O(n!)分析程序代码,记录每一个操作,这样做不太可行,工作量太大,所以一原创 2020-06-09 15:31:26 · 446 阅读 · 0 评论 -
编程基础概念:递推与递归
===》点我返回目录《===在进行计算的时候,经常会用到递推的概念。递推是一种用若干步可重复的简运算来描述复杂问题的方法。通常是通过计算前面的一些项来得出序列中的当前项的值。程序调用自身称为Recursive递归。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。比如对斐波那契数列,我们看这个函数的定义,fib(n)的返回值是fib(n-1)+fib(n-2)。这个概念上很清晰,但是原创 2020-06-09 15:29:18 · 762 阅读 · 0 评论 -
编程基础概念:进程与线程
===》点我返回目录《===对于操作系统而言,进程是整个系统的根本,操作系统是以进程为单位执行任务。随着技术发展,在执行一些细小任务,且本身无需分配单独资源时,进程的实现机制依然会繁琐的将资源分割,这样造成浪费,而且还消耗时间,所以就有了专门的多任务技术被创造出来——线程。 线程的特点就是在不需要独立资源的情况下就可以运行。如此一来会极大节省资源开销,以及处理时间。进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局原创 2020-06-09 15:28:38 · 311 阅读 · 0 评论 -
编程基础概念:面向对象编程
===》点我返回目录《===现在的世界,大家都用面向对象编程。这是结构化编程的基础上进一步发展出来的。以前编程的范式是数据结构+算法,后来软件规模越来越大,于是在一个程序里面出现了成百上千个函数过程和数据结构,程序很不容易维护。于是人们就把程序分解成子程序,子程序里面包含更小的组成部件,每个部件由一些数据结构及相关的算法组成。这些部件我们叫做对象。按照这样的观点,程序由一堆对象及对象间的消息互动组成。听起来好像很平常,甚至认为很自然很理所当然。这个思想却是一大进步。这个范式最后成为主流,现在几乎所有原创 2020-06-07 15:21:36 · 384 阅读 · 0 评论 -
编程基础概念:数据结构
===》点我返回目录《===前面我们已经用程序来处理数据了,隐含地把它们的组合也涉及了,也就是说,我们要处理的并不是一个数字,也不是单个字符,而是一组数字和字符。这是一种数据之间的组合结构。我们可以按照数据之间的关系进行分类,如果一组数据是一个接着一个的排着队,1:1,我们可以叫他们线性序列,如果它们是一个对应两个或者多个,1:N,我们叫这种结构为树,如果它们之间的关系是多对多,N:N,我们叫做图。线性序列: 48 6 57原创 2020-06-07 15:19:50 · 702 阅读 · 0 评论 -
编程基础概念:程序结构
===》点我返回目录《===我们这里探讨的程序结构,基于一个编程的范式:结构化编程(Structural Programming)。当然还有别的范式,技术演进的历史进程,通行的就是结构化编程和面向对象编程,而面向对象编程内部的基础还是结构化编程的底子。所以我这里也只说基本的结构化编程的程序结构。一个计算机程序从结构上来说,有三种结构:Sequence顺序,Decision分支和Repetition循环。科学家证明了只要这三种结构就可以完备地表达算法。Sequence顺序结构举例:a=1+2原创 2020-06-07 15:18:20 · 1796 阅读 · 0 评论 -
编程基础概念:编程语言
===》点我返回目录《===我们在演示理论计算机的时候,用了两种编程的方式,一种是二进制,一种是机器指令。 机器指令代码表示为:LOAD R0 40LOAD R1 41ADD R2 R0 R1STORE 42 R2HALT用十六进制表示为:10401141320124220000计算机编程语言就是指令规范,告诉机器怎么运行。前面演示看到的机器指令我们叫汇编语言。计算机语言虽然是给机器用的,但是却是人来写的,二进制和汇编太底层了,对人不友好,所以又进一步发展原创 2020-06-07 15:14:53 · 803 阅读 · 0 评论 -
编程基础概念:操作系统
===》点我返回目录《===上面我们探索到了一台理论上的计算机是什么样子的。为了让大家能使用计算机,这么一台裸机肯定是不行的,不能让大家自己去管理CPU,管理内存,管理输入输出设备,管理程序装载。这些底层的工作是统一的,不需要每一个使用计算机的人自己动手去做。这就诞生了操作系统,把计算机的这些组成部件的管理给包起来,然后使用计算机的人其实使用的是操作系统。操作系统可以看成是一个调度程序,它负责管理计算机这台设备,包括CPU、内存和I/O设备。那它调度什么东西呢?如果一台计算机是一种专用的机器,其原创 2020-06-07 15:12:45 · 424 阅读 · 0 评论 -
计算机内部探秘:程序执行
===》点我返回目录《===上面我们知道了存储和加法实现,但是这个还不是程序,那么一个程序是怎么在计算机内部执行的呢?有了前面的讲解,你能猜到,还不是一堆电路在飞速干活,这个过程好机械。这么想就对了,计算机就是一个又笨又快的机器。通过简单的门电路基本的功能(加法移位逻辑运算)组合成威力无比的现代计算机。你可能厌倦了在这么基本的物理层面学习计算机编程,但是稍安勿躁,虽然这很啰嗦,但是值得的,我们最后花点时间从底层看看现代伟大的发明计算机是如何执行的。现代计算机的理论模型是Turing图灵机,由原创 2020-06-04 14:28:27 · 826 阅读 · 0 评论 -
计算机内部探秘:统一到加法
===》点我返回目录《===我们继续深究下去,打破砂锅问到底。上述介绍的补码系统粗看起来这是比较奇怪的表示,实际上不然,了解了几种运算后,就会明白补码表示是多么简便。我们来看两个数的加减运算。a+b或者a-b。如果用我们平时数学上的表示,我们需要分别判断a和b的符号,加上运算符,就有8种组合:+++,++-,-++,-+-,--+,---,+-+,+--。我们的内部电路的运算需要判断八种情况,会比较复杂。如果用补码,因为补码自身已经处理了正负数,所以只需要判断运算符是+还是-,如果是+就把a原创 2020-06-04 14:25:25 · 469 阅读 · 1 评论 -
计算机内部探秘:进制转换及数据存储
===》点我返回目录《===我们生活中一直使用十进制系统,而计算机里面一直用二进制系统。这个系统由科学巨人Leibniz莱布尼茨重新发明并提倡。他还写过一篇文章,介绍二进制以及用它来解释古代中国伏羲图,以至于后来很多人认为他从《周易》中得到启发发明二进制。这种论调在民族自卑情节下流传广泛,这是往自己脸上贴金。(GottfriedLeibniz,1646.7.1-1716.11.14)我们来看看进制之间怎么转换。二进制到十进制是很简单的,一个二进制数根据公式其数值等于k*2n+K*2n..原创 2020-06-01 13:07:33 · 637 阅读 · 0 评论 -
初等数学题解:化乘除为加减
===》点我返回目录《===我们知道四则混合运算加减乘除是算数的基础,这里面乘和除又可以通过加减来实现,所以加减是更为基本的运算。这些我们小学就知道了,人类是这么走过来的,计算机也是这么走过来的。我们先来实现两个数的乘法,a*b,按照定义就是把a自加b次,如3*4,就是把3自己加自己总共加四次。程序如下:def multiply(a,b):if a==0 or b==0:return 0elif a==1:return b...原创 2020-05-29 16:02:10 · 1614 阅读 · 0 评论 -
初等数学题解:求阶乘的平方根
===》点我返回目录《===这个题目有点趣味,组合了前面两个题目。虽然内心有点疑惑,但是同古人同样不辞辛劳的你把上面两个题目的程序拼在一起:n=int(input("enter a number:"))result = 1while n>1 :result = result * nn = n - 1print (result)n=resultif n>=0:y=n/2while y**2-n>0.0001 o...原创 2020-05-29 15:56:43 · 923 阅读 · 0 评论 -
初等数学题解:求平方根
===》点我返回目录《===数学里面有很多操作是互逆的,正向操作简单,但是逆向操作很复杂。平方的逆操作是开平方根,这个开方操作计算起来并不容易。费了我们先人很多功夫。在中学的课本中,会讲到竖式计算法。它的基本思路是这样的:比如1156是四位数,不难看出它的平方根是个两位数,且十位上的数字是3.于是问题就转换成:怎样求出它的个位数a?根据两数和的平方公式,可以得到1156=(30+a)2=302+2*30a+a2,所以 1156-302=2×30a+a2,即 256=(30*2+a)a,这原创 2020-05-27 13:32:05 · 903 阅读 · 1 评论 -
初等数学题解:求阶乘
===》点我返回目录《===阶乘用符号表示为!,是一个连续的乘法,比如3!=3*2*1=6,通用式为n!=n*(n-1)*(n-2)*...*1。拿到了这个计算求4!这个题目,你毫不费力写下了这么个程序:print(4*3*2*1)运行结果为24。正确的。然后我们再计算8!,你虽然有点觉得不对劲,还是改写了上面的程序:print(8*7*6*5*4*3*2*1)运行结果为40320。还是正确。不过这个时候,你可能没有底气了,你担心下一个题目是50!。是啊,肯定有什么地方不原创 2020-05-27 13:27:22 · 1045 阅读 · 0 评论 -
初等数学题解:基本算术运算
---》点我返回目录《---计算机从名字来看就是用来做数学计算的,起初也确实是这样子。所以我们就先从Python做数学计算开始入手,解一下中学的数学题目。先做点基础知识的准备工作,看看对于数字,Python都有哪些基本运算。写一段程序如下:print (123+456)print (345-123)print (12*34)print (12345678987654321*12345678987654321)print (56/8)print (56/9)print原创 2020-05-27 13:17:30 · 647 阅读 · 0 评论 -
程序、数字与进制
程序、数字与进制现在我们用的计算机跟历史上发明的其它工具都不相同:它需要编程。人是好奇而有创造力的物种,从我们远古的祖先在数百万年前手握两块石头敲打砍砸发明石器那个时候起,人类就开始了漫长的发明之旅。(Olduvai砍砸器,约200万年前。大英博物馆收藏。)人类为了生存,不断迁徙和扩展,从非洲走出,遍布亚洲欧洲最后到美洲(那个南非出生的Elon Musk觉得地球装他不下了,一心要移民火星),一路上发明了许多帮助人类生存的工具。我们骄傲的祖先筚路蓝缕以启山林,发明了棍棒、长矛,点燃了火种,成了采原创 2020-05-22 10:44:12 · 831 阅读 · 0 评论 -
概述
概述本书不是Python语言教科书,我们使用一门语言,最主要的用途是用它来解决各种实际问题。这就是本书的重点:如何用Python语言来解决问题,也因此,本书将会有大量的代码演示及讲解。计算机编程,我们会要处理各种数据,使用各种算法,所以,本书将涉及到数据结构、算法等一些原理方面的知识。我们由浅入深,一步步讲解怎么编程序,因此,本书讲解的只是绝不仅仅限于学习Python,这里面学到的知识是通用的,你可以不费劲地用另一门语言替代书中的Python程序。基本内容如下: 程序、数字与进制 ...原创 2020-05-22 10:42:36 · 353 阅读 · 0 评论 -
什么是编程(Python版):目录
目录概述程序、数字与进制初等数学题解基本算术运算求阶乘求平方根求阶乘的平方根化乘除为加减计算机内部探秘进制转换及数据存储统一到加法程序执行编程基础概念操作系统编程语言程序结构数据结构面向对象编程进程与线程递推与递归分治算法及性能分析更多数学趣题求对数(向John Napier致敬)求质数Fibonacci斐波拉契数列Pascal/杨辉三角Hanoi塔走迷宫方程求解同余方程求面积(刘徽割圆术)Bernoulli伯努利数(向Ada致敬)字符处理字符编码Python字符串操作凯撒密码Caesar cipher原创 2020-05-22 10:41:40 · 721 阅读 · 0 评论