Office中国论坛/Access中国论坛
标题:
【算法】令人刮目相看的Abs函数
[打印本页]
作者:
盗梦
时间:
2015-4-18 12:04
标题:
【算法】令人刮目相看的Abs函数
本帖最后由 盗梦 于 2015-4-18 12:26 编辑
【算法】令人刮目相看的Abs函数
引言
:
或许你会认为Abs()就是一个取绝对值的函数,挺简单的。
没错,的确是挺简单的。但大道至简,简单的东西往往蕴含着很大的能量。
不信?往下看你就知道了。为了说明Abs在算法中的作用,我得举个例子。
抛砖引玉
:
用函数在立即窗口打印出下面的形状:
[attach]56144[/attach]
你懂循环的话,做这个当然不在话下:里面共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
复制代码
那现在在这个基础上变一下:
用函数在立即窗口打印出下面的形状:
[attach]56143[/attach]
这个一共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|
[attach]56148[/attach]
而星号部分,第一部分是i,第二部分是10-i。看上去没有明显规律,其实挖掘一下还是有的。
[attach]56149[/attach]
可以得到 y=5-|x-5| 这样的规律。图像变化是这样的
[attach]56150[/attach]
这样就可以利用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函数在算法中的威力还是相当大的。
同样,得出一个结论:
数学是很重要的
。
作者:
tmtony
时间:
2015-4-18 12:16
赞一个。把代码由复杂写到简单,不是件易事
作者:
t小宝
时间:
2015-4-18 17:00
{:soso_e179:}数学好可简化程序并提高效率,阿航多发一点数学的例子
作者:
盗梦
时间:
2015-4-18 17:03
t小宝 发表于 2015-4-18 17:00
数学好可简化程序并提高效率,阿航多发一点数学的例子
:lol:lol
作者:
a157838566
时间:
2015-7-28 11:34
不错,领教了
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3