设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1465|回复: 4
打印 上一主题 下一主题

[模块/函数] 【算法】令人刮目相看的Abs函数

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-4-18 12:04:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 盗梦 于 2015-4-18 12:26 编辑

【算法】令人刮目相看的Abs函数
引言
        或许你会认为Abs()就是一个取绝对值的函数,挺简单的。
        没错,的确是挺简单的。但大道至简,简单的东西往往蕴含着很大的能量。
        不信?往下看你就知道了。为了说明Abs在算法中的作用,我得举个例子。

抛砖引玉
        用函数在立即窗口打印出下面的形状:
        
        你懂循环的话,做这个当然不在话下:里面共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
复制代码
       那现在在这个基础上变一下:
        用函数在立即窗口打印出下面的形状:
        
        这个一共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|
        

        而星号部分,第一部分是i,第二部分是10-i。看上去没有明显规律,其实挖掘一下还是有的。
        
        可以得到 y=5-|x-5| 这样的规律。图像变化是这样的
        
        这样就可以利用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函数在算法中的威力还是相当大的。
        同样,得出一个结论:数学是很重要的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2015-4-18 12:16:54 | 只看该作者
赞一个。把代码由复杂写到简单,不是件易事

点击这里给我发消息

3#
发表于 2015-4-18 17:00:06 | 只看该作者
{:soso_e179:}数学好可简化程序并提高效率,阿航多发一点数学的例子

点击这里给我发消息

4#
 楼主| 发表于 2015-4-18 17:03:39 | 只看该作者
t小宝 发表于 2015-4-18 17:00
数学好可简化程序并提高效率,阿航多发一点数学的例子

:lol:lol
5#
发表于 2015-7-28 11:34:49 | 只看该作者
不错,领教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-7 07:02 , Processed in 0.104150 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表