Forth可以很方便的在一组数字中找出最大值和最小值,与通常程序语言相比,用forth会很有意思!
要找出一组数中的最大数和最小数,简单到python就一句:最大数 max([5,6,0,-1]),最小数 min([5,6,0,-1])。
可问题看似解决了,就像python中的set去重一样,其实并没有弄懂。如同很多功能在标准库中拿来随便用用就可以了,事实上大脑却没有思考过具体的原理。不用max函数,怎么解决? 那就自己写算法,用python、java或是C,差不多都是这样一种思路:先设定一个初始值max=list[0],循环遍历列表从i=0一直到最后一项len(list),在循环中每一项i都同max进行比较,如果那一项大于max,max就等于此项,min也一样。最后循环结束得出该值,python算法如下:
max, min = list[0], list[0]
for i in list:
if i > max or i < min:
max = i; min = i
print(max)
到此也该满意了吧?不过forth却不这么认为,forth可以不用变量,不用if条件判断、不用数组。forth的思想是从顶层进行设计,从底层进行开发。
Forth的代码可写成这样:
: 3max 3dup max max >r min min r> ;
: n_max depth 2 - 0 do 3max loop ;
5 6 0 -1 n_max
运行gforth,显示:-1 6
思路:先编写3max,利用max系统单词求出三个数中的最小值和最大值,并返回最小值和最大值,再同栈中前一个数值进行三个数比较,以此推出整个栈中的最小值和最大值。
将if和for隐藏在forth单词里,与传统算法相比确实不同。forth的思想相对于传统算法而言看似不太好懂,但一旦理解就会感受到forth的巧妙和有趣之处。如同本题一样,把问题分解成最简单的一个个小问题,再组合起来解决完整的问题,先解决3个数中求最大值和最小值,再扩展延伸至更多的数值上去。
想赶在10月24日写一篇学习forth的学习体会,可还是晚了一天。