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个星号构成。代码如下:
  1. Public  Function  PrintStart()
  2.     Dim i As Integer
  3.     Dim strText As String
  4.    
  5.     For i = 1 To 5
  6.         strText = strText & String(5-i, " ") & String(i, "*") & vbCrLf
  7.     Next
  8.     Debug.Print strText    '在立即窗体打印结果
  9. End  Function
复制代码
       那现在在这个基础上变一下:
        用函数在立即窗口打印出下面的形状:
        [attach]56143[/attach]
        这个一共9行,需要循环9次。普通的方法是这样的:需要分两部分来显示,第一部分是前5行,可采用上面的方法;第二部分是后面4行,是倒过来。代码可以这么写:
  1. Public  Function  PrintStart()
  2.     Dim i As Integer
  3.     Dim strText As String
  4.    
  5.     For i = 1 To 9
  6.         If i<=5 Then
  7.             strText = strText & String(5-i, " ") & String(i, "*") & vbCrLf
  8.         Else
  9.             strText = strText & String(i-5, " ") & String(10-i, "*") & vbCrlf
  10.         End If
  11.     Next
  12.     Debug.Print strText    '在立即窗体打印结果
  13. 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函数简化上面的代码:
  1. Public  Function  PrintStart()
  2.     Dim i As Integer
  3.     Dim strText As String
  4.    
  5.     For i = 1 To 9
  6.         strText = strText & String(Abs(5 - i), " ") & String(5 - Abs(5 - i), "*") & vbCrLf
  7.     Next
  8.     Debug.Print strText    '在立即窗体打印结果
  9. 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