随便写写(1)——欧几里得算法求最小公约数
——–2017.7.23夜————–
准确的来说我这篇文章可能并没有什么阅读价值,决定开的这个系列可能也没有,但是对于我来说,就成为了一种动力和期待。我喜欢在网上分享我的看法,无论声音的大小,我都很开心。
---------正文---------
说实话,博主第一次看见这个算法命名时以为是某个几何定理,因为欧式几何系统一定是每一个中国学生都经历过的。但是这里,鉴于该算法的用途,欧几里得算法又称辗转相除法,博主能想到读者脑中可能浮现的那个在算最大公约数时草稿本上画上一层一层阶梯,最后老师说:"把最右边的数字乘起来就是两个数的最大公约数"这,就应该是辗转相除法最原始最形象的模型了吧。(此处可能理解有误,欢迎大佬指正)
那么之于编程语言,这样的“数学形式”能否用算法等价的刻画呢?我们应该知道,人类世界已经无处不在的被算法所占据,哪怕是一个很微小的程序(这里微小指实现功能单一)都蕴含着算法思想,因为只要我们解决某一类问题用到了模式化的思维方式,都可以叫做我们在使用某种算法(这里指广义的算法,编程算法满足别的要求)但是我们的社会,我们人生又不仅仅是算法,算法要求的精确性要求在一些典型的实例中无法被满足,说白了——有公式,有输入,还真不一定现实生活中的输出就真的如你所愿对吧,人生的趣味恰恰在于他的不确定性(量子物理23333)
扯远了。。。
那么对于欧几里得算法,有一个普遍形式为gcd(a,b),这里gcd全称是Greatest Common Divisor,即”最大公约数“的英文解释。狭隘一点来说,gcd(a,b)形式可以看成一个自定义的函数,有函数名gcd,参数名称a和b,要是严格按照数据结构的算法形式的话还应该有参数数据类型的限制等,这里参数数据类型就要求为int(整型)
对于获取我们想要问题的答案,有很多种方法,但往往这些方法中,都遵循着某种方法,如果有例外,那么就多找几个这种问题再想解决的方法,纵向比较不出规律我们就可以尝试横向比较,这时往往规律就显而易见了,算法也就是这样描述的——解决某种问题的一系列指令构成的集合。
我们设计这种算法自然不是为了解决小学数学题,而是为了锻炼思维,或者更一般的,获取解决求这类问题的一般方法或者灵感(从求最大公约数问题中提炼的方法解决其他现实问题)
算法gcd(a,b)
while b!=0 do :
c<-a mod b
a<-b
b<-c
return b
这或许是初学算法设计的人都会遇到的一个极为简单的算法了,或许有的读者你还看不太明晰,但是即使没有学过数据结构,通过简单的符号或许能看出一点端倪,是的,这个算法运行的过程我确信多半跟正在看文章的你心里所想的八九不离十,他确实简单,但是我想知道一个问题:
如何以更一般的方法求得N个数的最大公约数?
—————22:04—————
第一次写完博文,心情难受并开心,难受的是技术上的东西我根本不懂多少,开心的是我的一点感悟能被某个人,运气好一群人所看到,这是我所开心和忧虑的。
PS 1:拓展的问题我会专门再在一个栏目写
PS 2:自己觉得博文完全手写自己才有兴趣写,别人才有兴趣看,所以技术的东西可能就少点了,只是更多想分享我的一些遐想罢了,毕竟,会瞎想的程序员也是稀缺物种对吧?