先从一段Ruby程序开始,即欧几里德最大公约数的算法实现: 测试用例当然要先,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 require 'test/unit' require './one/Apple' class TestApple < Test::Unit::TestCase def test_cal ys = Apple.new assert_equal(5 ,ys.gcd(35 ,25 ) ) assert_equal(50 ,ys.gcd(100 ,50 ) ) assert_equal(9 ,ys.gcd(27 ,18 ) ) assert_equal(5 ,ys.gcd(5 ,10 ) ) assert_equal(5 ,ys.gcd(5 ,0 ) ) assert_equal(-5 ,ys.gcd(-5 ,0 ) ) assert_raise(ArgumentError) {ys.gcd(0 ,0 ) } assert_equal(23 ,ys.gcd(0 ,23 ) ) end end
然后就是算法的实现代码了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Apple def gcd(arg1=0 , arg2=0 ) if ((arg1==0 )&&(arg2==0 )) raise ArgumentError , "arg1 and arg2 are 0." , caller else gcdImpl(arg1,arg2) end end def gcdImpl(arg1=0 , arg2=0 ) if (arg2 == 0 ) return arg1 elsif temp=arg1%arg2 if (temp == 0 ) return arg2 else gcdImpl(arg2,temp) end end end end
从一个算法的描述来实现一个算法,仅仅是编写一段程序而已。而对于算法这种问题的程序化解决方案而言,需要如何一回事情呢?比方说,最大公约数到底是怎么一回事,5和0的最大公约数怎么可能是5呢?所以要学习算法到底是怎么一回事,需要探讨更多的问题? 对于问题的理解、性能、选择、数据结构、如何设计、算法的描述、正确性证明、分析、代码实现等等一系列单元。当程序实现仅仅是第一反应的时候,问题理解、分析、设计、验证就变得异常重要了。 算法所拥有的通用问题类型:排序、查找、字符串处理、图问题、组合问题、几何问题、数值问题;都是一些已经相当成熟的问题类型。很多使我们常常听说或者涉及的,也是算法设计和分析频繁的地方,算是很多的“肩膀”吧,算法都是都是在这里站立起来的。