用指定数字拼接指定结果的算式
vb吧
全部回复
仅看楼主
level 11
递归。加减。示例。
运行结果
2021年03月17日 02点03分 1
level 11
缺点:
①递归,对初学者不好理解和设计
②运行速度慢(几乎不能容忍)
2021年03月17日 02点03分 2
首项符号,最后没有使用。
2021年03月17日 02点03分
第一遍看过去,几乎可以忽略。仔细一看,几乎不能容忍[滑稽]
2021年03月17日 03点03分
@余思培 哈哈哈,真的,慢的很,慢的很
2021年03月17日 03点03分
level 11
你为什么把CreateObject放在里层?其实可以考虑放在最外层,启动时创建,结束时销毁(释放),应该会快一点
2021年03月17日 05点03分 3
是的。应该如此。
2021年03月17日 06点03分
@sysdzw 本吧逛少了,1.中文可以作为变量名,2.这位大佬习惯使用中文变量
2021年03月17日 10点03分
@sysdzw 补个[滑稽]
2021年03月17日 10点03分
@sysdzw 哈哈哈,看多了就顺眼了,哈哈哈哈
2021年03月17日 10点03分
level 11
大佬,好像你的回复全被吞了(或者过一会儿才能显示,要不私聊?)
2021年03月17日 15点03分 4
level 11
虽然还是看不到你那边的回复(不知道到底是那边被限制了),但我还是说一下我这边的分析
dwCount = 0
dfTA = Timer
Set objScript = CreateObject("MSScriptControl.ScriptControl")
objScript.Language = "vbscript"
Set objScript = Nothing
dfTB = Timer
Print Format(dfTB - dfTA, "0.000000 s")
你可以测试一下这段代码,然后你会大致获取你单次CreateObject并又释放内存所消耗的时间,然后你再使用一个变量统计一下你的 计算 函数被调用了多少次,然后就可以大致算出你被这一过程多消耗了多少时间。
2021年03月17日 15点03分 5
我试验了这个1000次用时1.5s左右。可见耗时是很严重的。
2021年03月18日 06点03分
level 11
最神奇的是,我统计了调用计算的次数后,稍作更改,并增加了一个判断:
If dwCount = 19680 Then DoEvents'19680为测试出来的需要调用计算的数量,并且此语句添加后便又能正常运行了,真是奇怪。
2021年03月17日 15点03分 6
很怪,刚刚测试又是18422,我迷了,明天再测试吧
2021年03月17日 15点03分
谢谢你的耐心试验。
2021年03月18日 00点03分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 兴趣所至[滑稽],对了,把变长改为定长String并使用Mid$操作会快一点,提升不是很明显,但确有提升。另把递归改循环也会快一点
2021年03月18日 01点03分
@余思培 这个题目最初就是用来练习递归的;变长只是长期养成的不良习惯,在这里是应该改的,只是每次计算前要做一次删除空格的替换
2021年03月18日 01点03分
level 13
Private Obj As Object
Private Sub Form_Load()
Set Obj = CreateObject("MSScriptControl.ScriptControl")
Obj.Language = "vbscript"
End Sub
Private Sub Command1_Click()
计算 = Obj.eval(算式)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set Obj = Nothing
End Sub
推荐这样的写法,递归或循环中反复创建同一个对象是没有必要,而且对速度有影响
2021年03月18日 07点03分 7
是的
2021年03月18日 07点03分
level 11
今天,对 @隨風
缒夢 以及 @
余思培 两位大侠指教的代码进行了测试。汇报结果如下:
1、我原程序运行时间(在Command1_Click增加了计时)26.34766s
2、空运行创建对象、设语言属性、撤销这组语句3^9次(即19683次),耗时25.16016s
3、使用只创建设置撤销一次(且创建、设置、撤销时间在计时之外),同时取消了19000余次调用函数后,耗时0.46875s
感谢两位大侠的指导和帮助!
2021年03月21日 06点03分 8
下一个需要改进的应该就是拼凑算式,其实不用每次都从第一项开始,而是每轮值拼凑当前项。177147次&运算就可以减少到3(1+3+9+……6561)=29523次
2021年03月21日 06点03分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 如此修改后提高到0.3s左右
2021年03月21日 06点03分
level 13
@璐村惂鐢ㄦ埛_0748V5Z馃惥 CreateObject("MSScriptControl.ScriptControl")实际引用的是msscript.ocx,而赋值到Object是后期绑定,赋值到ScriptControl是前期绑定
也就是说:
Private Obj As Object
Private Sub Form_Load()
Set Obj = CreateObject("MSScriptControl.ScriptControl") '由于Obj的Object类型,所创建的对象属于后期绑定,因为不知道其属性和函数
Obj.Language = "vbscript"
End Sub

Private Obj As ScriptControl
Private Sub Form_Load()
Set Obj = CreateObject("MSScriptControl.ScriptControl") '由于Obj的ScriptControl类型,所创建的对象属于前期绑定,需要引用msscript.ocx,已经知道其属性和函数
Obj.Language = "vbscript"
End Sub
上面的也可以改成(由于引用了msscript.ocx,直接new就行)
Private Obj As ScriptControl
Private Sub Form_Load()
Set Obj = New ScriptControl
Obj.Language = "vbscript"
End Sub
Private Obj As ScriptControl 这种前期绑定的调用的函数也比后期的要快(具体可以参考相关资料了解)
所以之前的代码改成先引用mscript.ocx(相当于引用tlb,不是部件里添加),调用Eval效率大概能提升20%左右
还一种是直接在部件里引用mscript.ocx,应该都是知道的
2021年03月21日 07点03分 9
我是野路子,看到别人用,抄过来的。听你这么一讲,我再认识认识,用反复加载和销毁,运行比较比较。谢谢指导。
2021年03月21日 07点03分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 网上大多数都是Object类型然后CreateObject实现,这种简单不需要在工程里引用,凡事都是一样(有一得必有一失,而要效率高必然也要付出一点代价)
2021年03月21日 07点03分
@隨風🍁缒夢 是的,确实是这样。
2021年03月21日 07点03分
用脚本控件的方式,运行正式程序,耗时0.24~0.31s,0.26~0.27s出现比较多
2021年03月21日 07点03分
level 11
最终结果,确定如下:
2021年03月21日 07点03分 10
level 11
这是引用的情况。
在不引用的情况下声明为对象时,消耗时间大约为26秒所有(与前文的29秒相差较多,估计应该属于机器的后台运行程序数量内容造成)。
2021年03月21日 07点03分 11
level 11
虽然在当前条件下,似乎已经可以接受
但是如果改为+,-,/,*,^五种运算,不加括号,不增加数目仍然是1~10是个顺序数,竟然运行了161s
估算做了6^9≈1千万个算式
2021年03月21日 08点03分 12
level 11
虽然你是以此练习递归的,但我还是给你看下循环的有多快(你的机子会更快一点)[你懂的]
2021年03月21日 10点03分 13
复制这段内容后打开百度网盘App,操作更方便哦。链接:网页链接提取码:hvj3
2021年03月21日 10点03分
我,我学习学习
2021年03月21日 11点03分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 我这个还有一小半的速度可以优化[你懂的][滑稽]
2021年03月21日 12点03分
@余思培 感觉有点太高深了,尽管结合了你前一向说的指针思路,对代码进行了阅读,仍然读不懂。辜负了你的深情厚谊呀,我将继续阅读你的程序,相比一旦懂了,就会有点进步。谢谢你
2021年03月21日 12点03分
level 11
挖一下坟,补个注释
2021年04月25日 17点04分 14
1