打字猴:1.700414731e+09
1700414731
1700414732 如果用通俗易懂的语言来说,算法就是“把解决问题的步骤无一遗漏地用文字或图表示出来”。要是把这时的“用文字或图表示”替换为“用编程语言表达”,算法就变成了程序。而且请注意这样一个条件,那就是“步骤必须是明确的并且步骤数必须是有限的”
1700414733
1700414734 接下来先举一个具体的例子,请想一想解决“求出12和42的最大公约数”这个问题的算法。最大公约数是指两个整数的公共约数(能整除被除数的数)中最大的数。最大公约数的求解方法应该在中学数学课上学过了。把两个数写在一排,不断地寻找能够同时整除这两个整数的除数。最后把这些除数相乘就得到了最大公约数(如图5.1所示)
1700414735
1700414736 图5.1 在中学学的求解最大公约数的方法
1700414737
1700414738
1700414739
1700414740
1700414741 用这个方法求出了6是最大公约数,结果正确,但这些步骤能够称为算法治理?答案是不能,因为步骤不够明确
1700414742
1700414743 步骤1的“用2整除12和42”和步骤2“用3整除6和21”,是怎么知道要这样做的呢?寻找能够整除的数字的方法,在这两步中并没有体现。步骤3“没有能同时带队和7的除数”,又是怎么知道的呢?而且,到此为止无需后续步骤(即步骤数是有限的)的原因也是不明确的
1700414744
1700414745 其实这些都是凭借人类的判断。在解决问题的步骤中,有了与直觉相关的因素,就不是算法了,既然不是算法,也就不能用程序表示了
1700414746
1700414747
1700414748
1700414749
1700414750 计算机是怎样跑起来的 [:1700412660]
1700414751 计算机是怎样跑起来的 5.3 要点2:计算机不靠直觉而是机械地解决问题
1700414752
1700414753 计算不能自发地思考。因此计算机所执行的由程序表示的算法必须是由机械的步骤所构成。所谓“机械的步骤“就是不用动任何脑筋,只要按照这个步骤做就一定能完成的意思。众多的学者和前辈程序员们已经发明创造了很多机械地解决问题的步骤,这些步骤并不依赖人类的判断,由此构成的算法被称为”典型算法“
1700414754
1700414755 辗转相除法(又称欧几里德算法)就是一个机械地求解最大公约数问题的算法,在辗转相除法中分为使用除法运算和使用减法运算两种方法。使用减法运算简单易懂,步骤如图5.2所示。
1700414756
1700414757 图5.2 根据辗转相除法求解最大公约数的方法
1700414758
1700414759
1700414760
1700414761
1700414762 用两个数中较大的数减去较小的数(步骤),反复进行上述步骤,直到两个数的值相等(步骤的终止)。如果最终这两个数相同,那么这个数就是最大公约数。请注意以下三点:(1)步骤是明确的、完全不依赖直觉的;(2)步骤是机械的、不需要动脑筋就能完成的;(3)使步骤终止的原因是明确的
1700414763
1700414764 使用辗转相除法求解12和42的最大公约数的程序代码如代码清单5.1所示。本章展示的程序都是用VBScript编写的。只要把代码清单5.1中的内容输入文本编辑器,保存成扩展名为.vbs的文件,双击这个文件,程序就可以运行了(如图5.3所示)。即使读不懂这段程序代码的内容也没有关系。这里需要注意的是该算法和所描述的步骤是可以直接转换成程序的。
1700414765
1700414766 代码清单5.1 求解12和42最大公约数的程序
1700414767
1700414768 a=12
1700414769
1700414770 b=42
1700414771
1700414772 while a<>b
1700414773
1700414774   If a>b Then
1700414775
1700414776 a=a-b
1700414777
1700414778   Else
1700414779
1700414780 b=b-a
[ 上一页 ]  [ :1.700414731e+09 ]  [ 下一页 ]