《计算机程序设计艺术 第一卷》-1.2 数学知识准备
这章介绍了这本书用到的数学知识和符号。
1.2.1 数学归纳法
采用逻辑的链条结构,在链条的第一个节点为真的时候,且证明了p(n)为真时 p(n+1)也为真,则整个逻辑链为真。
书上的算法I1 也只是用程序打印了这个思路,并没有真的证明。证明的有效性依然是人(或者是依靠逻辑的有效性)来保证的。
在前面一章Basic Concepts 中,算法 E介绍了一种用递归求最大公约数的算法。(Euclid\'s algorithm)
在这章中这更近一步了,Extended Euclid\'s algorithm 可以在算出最大公约数(gcd,greatest common divisor)的同时,导出两个整数a和b,使得 贝祖等式 am+bn = gcd(m,n) 成立。
并介绍了一种画出流程图,在流程的每一步添加Assert的方法。当每个步骤成立的时候,意味着每个Assert断言都成立。 更加意味着,当第n次执行被证明正确的时候,第n+1次执行也是正确的。

这种证明算法正确性的方法还有一个更为重要的方面:它反映了我们理解算法的方式。
我们在看一些定理的时候,常常很迷糊,但是看到例子的时候似乎就理解了。这其实是因为这些例子帮助我们在头脑中形成了各种断言。
我们真正的理解一个算法是有效的,只有当我们的思想已经隐式的填充了所有的断言,就如上图所示。这也意味着当一个人向另外一个人讲述算法的时候,这些不能被自动推理出来的断言应该被陈述出来。在提E算法的时候,就应该提到断言A6。
注意:上面的步骤只能证明了当算法能够中断的时候,它是正确的。
习题13提供了证明能够中断的方法。

其实只需要在A3,A5,A6的地方,让T = T+1,则可以构造出T<=3n,因为在A3的断言中,有一个statement是:
,而d的最大值就是n,所以每一次迭代r的最大值是d-1,而r等于0的时候,程序就中断了,所以A3最大执行次数是n,所以
,得证。