|
本帖最后由 盗梦 于 2015-4-18 12:26 编辑
【算法】令人刮目相看的Abs函数 引言:
或许你会认为Abs()就是一个取绝对值的函数,挺简单的。
没错,的确是挺简单的。但大道至简,简单的东西往往蕴含着很大的能量。
不信?往下看你就知道了。为了说明Abs在算法中的作用,我得举个例子。
抛砖引玉:
用函数在立即窗口打印出下面的形状:
你懂循环的话,做这个当然不在话下:里面共5行,则要循环5次。每一行前面都有空格,而且每行空格数是递减的。例如第一行是4个空格加1个星号构成;第二行是3个空格加2个星号构成。代码如下:- Public Function PrintStart()
- Dim i As Integer
- Dim strText As String
-
- For i = 1 To 5
- strText = strText & String(5-i, " ") & String(i, "*") & vbCrLf
- Next
- Debug.Print strText '在立即窗体打印结果
- End Function
复制代码 那现在在这个基础上变一下:
用函数在立即窗口打印出下面的形状:
这个一共9行,需要循环9次。普通的方法是这样的:需要分两部分来显示,第一部分是前5行,可采用上面的方法;第二部分是后面4行,是倒过来。代码可以这么写:- Public Function PrintStart()
- Dim i As Integer
- Dim strText As String
-
- For i = 1 To 9
- If i<=5 Then
- strText = strText & String(5-i, " ") & String(i, "*") & vbCrLf
- Else
- strText = strText & String(i-5, " ") & String(10-i, "*") & vbCrlf
- End If
- Next
- Debug.Print strText '在立即窗体打印结果
- End Function
复制代码
绝对值函数发威:
仔细分析,打印空格第一部分是5-i,第二部分是i-5,很自然的就发现可以统一用Abs(5-i)代替。
它的规律是4 3 2 1 0 1 2 3 4。若采用数学的方法作图,应该是这样的:
y = |x| 需要向右平移5个单位 则变成 y = |x-5|
而星号部分,第一部分是i,第二部分是10-i。看上去没有明显规律,其实挖掘一下还是有的。
可以得到 y=5-|x-5| 这样的规律。图像变化是这样的
这样就可以利用Abs函数简化上面的代码:- Public Function PrintStart()
- Dim i As Integer
- Dim strText As String
-
- For i = 1 To 9
- strText = strText & String(Abs(5 - i), " ") & String(5 - Abs(5 - i), "*") & vbCrLf
- Next
- Debug.Print strText '在立即窗体打印结果
- End Function
复制代码 一样可以得到同样的效果。是不是很神奇啊{:soso_e144:}
Abs函数在算法中的威力还是相当大的。
同样,得出一个结论:数学是很重要的。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|