在我看来,CPU 就是计算机的核心,是真正用于计算的,而硬盘的读取速度太慢,所以由读取速度较快的内存来向 CPU 提供数据,指令就是告诉 CPU 去如何计算的。
1.图灵机
根据我自己的理解,制造图灵机只需两点:a.在一条无限的纸带上有无限的格子 b.每个格子上的内容可以任意修改,这样理论上就可以进行任何的计算过程(描述中没有提到停机问题,详情请参见维基百科)。
2.冯·诺依曼结构的工作原理
计算机的五大组成部分:运算器+控制器(CPU),存储器(内存),输入设备,输出设备。
图中的计算例子:
把地址为1000的数字取出来放在寄存器 EAX 中,然后把地址为1004的数字取出来放在寄存器 EBX 中,把两个寄存器中的值加起来,放到 EBX 中。
数据和指令以二进制形式,不加区别的存放在存储器中
CPU 执行指令主要分三步:
a.取指:从内存中把指令取出来
b.译码:看看这个指令看啥事的
c.执行
有种说法还有第四步写回,就是写回到内存中。
3.上帝的规则:局部性原理
时间局部性:如果程序中的某条指令一旦被执行,则不久之后该指令可能被再次执行;如果某条数据被访问,则不久之后该数据可能会被再次访问。
空间局部性:一旦程序访问了某个存储单元,则不久之后,其附近的存储单元可能也将被访问。
4.递归
尾递归:当递归调用时函数体中最后执行的语句并且它的返回值不属于表达式一部分时,这个递归就是尾递归。
我理解的就是,递归项只是单纯的调用自己,改变参数而已,不需要方法本身参与额外的计算,因此可以复用栈帧。
举例:阶乘
一般的递归算法:
int factorial(int n) {
if (n == 1) {
return 1;
}
return n * factorial(n - 1);
}
计算过程:
尾递归算法:
int factorial(int n, int result) {
if (n == 1) {
return result;
}
return factorial(n - 1, n * result);
}
计算过程: