程序员的数学--笔记

第一章

在10进制计数法中,位数少,但是数字种类多;对人类来说,比较易用。
在2进制计数法中,数字种类少,位数多;对计算机来说,比较易用。

N进制计数法:使用0,1,2,3,...,N-1,共N种;从右往左分别为N0的位,N1的位,N2的位...(基数是N)。

以上,使用按位计数。

罗马计数法:不使用按位计数。数位没有意义;只表示数字本身;没有0.
            使用I(1),V(5),X(10),L(50),C(100),D(500),M(1000)来计数;
            将并排的数字加起来,就是所表示的数。
    例如:3个并排的I(III)表示3, 并排的V和I(VI)表示6,VIII表示8.LXXVIII(78)。
    罗马计数法中还有“减法规则”。例如IV,在左侧写I表示4.

2、指数法则

   定义10的零次方:
           10的3次 = 1000
           10的2次 = 100  
       10的1次 = 10
       10的0次 = 1
     即:每当10的右上角数字(指数)减1,数就变为原来的十分之一。因此,10的0次方就是1.
   综上:在定义10的n次方(n包括0)的值时可以遵循以下规则:指数每减1,数字就变为原来的
   10分之1.对于负指数也一样。  

  指数法则:N的a次方 乘 N的b次方 = N的 a+b 次方, N不为0.

 思维方式:以简化规则为目标去定义值。    

3、0的作用
   站位;统一标准,简化规则

4、为甚么人类发明计数法? 数越大就越难处理,计数法就是将大问题分解为小单元。

 思想:要解决大问题,就将它分解成多个小“单元”,如果小“单元”还是很大,那就继续分解成更小的
       ”单元“,直到问题最终解决。
 

第二章 逻辑

   学习逻辑的基本思路:兼顾完整性和排他性。(规则既不能遗漏也不能重复)
1、逻辑的重要性:逻辑是消除自然语言的歧义、严密准确地记述事物的工具。

   命题:能够判断对错的陈述句,叫命题。正确时 为真; 错误时 为假。命题要么真,要么假。
         同时满足true和false的不叫命题;同时既不为true,也不为false的也不叫命题。

  真值表, 文氏图(表示集合)


  A => B A蕴含B, 表示若在A中,必在B中。
  对偶性 :
      即true <->  false
        A    <->  非A
        /\   <-> \/
     它们相互成对, 这称作逻辑表达式的对偶性。分别将true和false, A和非A,/\和\/
     互换,就能得到该逻辑表达式的否定式。

     德.摩根定律:  (非A) \/ (非B) = 非(A/\B)  (非A) /\ (非B) = 非(A\/B)

2、卡诺图 用来简化逻辑表达式、设计逻辑电路等。

3、包含未定义的逻辑
   程序经常会由于发生错误,导致退出、崩溃、陷入无限循环、抛出异常等情况,得不到
   true和false中的任何一个值。为了同样能表示这种”得不到值“的情况,又引入了一个
    叫undefined的值,意为”为定义”。
    true  真
    false 假
    undefined  未定义
   称为“三值逻辑”。

    未定义的逻辑的下面几种情况:
  1)带条件的逻辑与(&&):
    A&&B , 通过真值表,得到结论:
    不包含undefined的行, 和逻辑与 A/\B相等;  
    A为true时,A&&B 和B 相等;
    A为false时, A&&B 恒为false;
    A为undefined时,A&&B恒为undefined。
  2)带条件的逻辑或(||)
     不包含undefined时,A||B和A\/B相等
     A为true时,A||B 恒为true;
    A为false时,A||B 和B相等;
    A为undefined时,A||B恒为undefined。
  3)三值逻辑中的否定(!)
     !A
     不包含undefined时, !A和非A相等
     A为true时,!A为false;
    A为false时, !A为true;
    A为undefined时,!A也为undefined。
 4、三值逻辑的德.摩根定律
    (!A)||(!B) = !(A&&B)
    (!A)&&(!B) = !(A||B)
  思想:复杂的规则-->通过逻辑表达式--->利用卡诺图--->简化的逻辑表达式--->简单的规则。

第三章 余数 --周期性和分组,奇偶性

1、余数的力量--将较大的数除一次就能分组

2、欧拉是图论的开山鼻祖。

3、顶点所关联的边数,称作顶点的度。度数为偶数的顶点称为“偶点”,度数为奇数的顶点称为“奇点”。

4、奇偶校验

5、欧拉论断:如果能够一笔画成,必须满足所有顶点都是偶点或者只有2个奇点。
   思维方法:观察各顶点的边数时,着眼点不在“数的本身”,而是“数的奇偶性”。

第四章 数学归纳法--征服无穷数列

数学归纳法是证明某断言对于0以上的所有整数(0,1,2,3...)都成立的方法。

1、编程与数学归纳法
   循环不变式:在编写循环时,找到让每次循环都成立的逻辑表达式很重要,这种逻辑表达式称为
               循环不变式。循环不变式相当于用数学归纳法证明的“断言”。


第五章 排列组合---解决计数问题的方法

计数时要注意“遗漏”和“重复”。

1、置换:将n个事物按顺序进行排列称为置换。

2、排列:从n个事物中取出k个进行排序。

3、组合:从n个事物中取出k个总共有多少种取法。不考虑顺序。
   可以这样考虑组合:首先和排列一样“考虑顺序”进行计数;
    除以重复计数的部分(重复度)。


第六章 递归

递归的思维方式:能将复杂的问题转换为较为简单的同类问题吗?如果满足递归结构,
                找出递归结构并建立递推公式。如果找不到解析式,只建立递推公式也
                非常有用。
为找出复杂问题中隐含的递归结构:
     从整体问题中隐去部分问题(相当于关注特定牌);
     判断剩余部分是否和整体问题是同类问题。
或者说:
     从n层的整体问题中隐去部分问题。
     判断剩余部分是否是n-1层的问题。

组合:分组,一般用包含与不包含某个特定元素这种思维。

谢尔平斯三角形--递归图形
分形图:具有递归结构的图形。

第七章 指数爆炸--如何解决复杂问题

指数爆炸:数字不断翻倍。汉诺塔随圆盘数目增加,操作步骤呈指数增长;斐波那契数列也
          呈指数增长。

1、爆炸源在哪里?

   有倍数的地方,就有指数爆炸。

2、如果问题中含指数爆炸,就不能简单地采用“一个不漏”的方法解决。

3、对数--掌握指数爆炸的工具
   对数可将乘法转换为加法运算.

4、如何处理指数爆炸

   1)理解问题空间的大小
   2)四种方法处理指数爆炸问题
      极力求解;知道方法后极力求解;
      变相求解:转换成简单问题求解;
      近似求解:不求完全解答,而是找出近似解;
      概率求解:使用随机数的方法。

第八章  不可解问题---不可解的数、无法编写的程序

1、反证法:

2、可数:集合的元素是有限的,或者集合中的所有元素都与正整数一一对应,这时集合就被定义为可数。
         简而言之,能按顺序第1,第2,第3...来数元素的集合就是可数的。“可数”就是可以计数。
   有限集合石可数的;
   0以上的所有偶数的集合是可数的;
   所有整数的集合是可数的;
   所有有理数的集合是可数的;
   程序的集合是可数的;

   所有整数数列的集合是不可数的;
   所有实数的集合是不可数的;
   所有函数的集合也是不可数的;

3、不可解问题
    1)什么是不可解问题
       原则上不能用程序来解决的问题。
       存在不可解问题。
4、停机问题
    某程序在给定数据下,是否会在有限时间内结束运行。

第9章

1、何为解决问题
1)认清模式,进行抽象化
    在解答思考题时,经常先用“较小的数试算”,这有利于发现规律、性质、结构、循环、一致性等,
   认清隐含在问题中的模式。另外“对目前得到的结果进行抽象化”。通过抽象化,可以将结论运用到
   当前问题以外的其他问题中。
2)由不擅长催生出的智慧
   人类不擅长处理庞大的数字, 产生了计数法;
   人类不擅长毫无差错的进行复杂判断,产生了逻辑;
   人类不擅长处理大量事物,产生了分组;
   人类不擅长处理无穷,产生了通过有限步骤处理无穷。
2、幻想法则
   如果有“现实世界”解决不了的问题
   (1)将问题从“现实世界”带到“幻想世界”
   (2)然后在“幻想世界”解决问题
   (3)最后,将答案带回“现实世界”

3、程序员的数学
    在一般的编程中,程序员通常不需要掌握深奥的数学知识。不过,认清并简化问题结构,总结出具有
    一致性的规则等,对于程序员来说是家常便饭。
    不要觉得“不擅长数学”就漠然处之,而要想到“数学妙趣横生,要多加运用”,给每天的编程都注入
    数学的思维方式。

你可能感兴趣的:(程序员的数学--笔记)