|
发表于 2010-1-24 13:27:38
|
显示全部楼层
本帖最后由 supersp 于 2010-1-24 14:27 编辑
回复 43# afan
要跳出递归,其实很简单...
加个变量判断就行, 在程序中的2个地方使用了FOR,而递归的时候实际上每一层都有FOR循环的, 找到合适的值后,exitloop 1 就能让程序一层一层跳出来,延迟是有..但也就几个毫秒的事。
而且递归的时候直接跳到主程序可能引发内存问题..
那段代码我测试了很多组合,平均每找到一个组合耗时 0.8 ms..
下面这段39个元素,编译器里跑,4-5ms,还有可能2ms耗在数组排序上#Include <Array.au3>
Dim $aArray[39] = [28,15,34,48,51, 8, 13, 2, 52, 61, 37, 85, 19, 11, 7, 62, 22, 38, 79, 53,54,55,56,57,58,59,60,63,64,90,91,92,93,94,95,96,97,98,99]
$begin = TimerInit()
_ArraySort($aArray)
$m = UBound($aArray)
Global $display[1]
Global $jump=0 ;递归退出变量
;折半法,找出 105/2 的分界线
Local $min=0,$max=$m-1,$mid,$fjx=-1
If $aArray[0]>=58 Then $fjx=0
If $aArray[$max]<58 Then $fjx=$max
While $fjx=-1
$mid=($min+$max)/2
If $aArray[$mid] >= 58 Then
$max=$mid-1
If $aArray[$mid-1] < 58 Then $fjx=$mid
Else
$min=$mid+1
If $aArray[$mid+1] >= 58 Then $fjx=$mid+1
EndIf
WEnd
_xh(0,"",$fjx-1)
For $v2 = $fjx To $m-1
If $jump Then ExitLoop
_xh($aArray[$v2],String($aArray[$v2])&"+",$fjx-1)
Next
_ArrayDelete($display, 0)
$dif = TimerDiff($begin)
_ArrayDisplay($display,"耗时:"&$dif)
Func _xh($var,$str,$n)
For $i = $n To 0 Step -1
If $jump Then ExitLoop
$num = Execute("$var + $aArray[$i]")
Switch $num
Case 103 To 104
_ArrayAdd($display,$str&String($aArray[$i])&"="&String($num))
$jump=1
ExitLoop
Case 1 To 102
_xh($num,$str&String($aArray[$i]&"+"),$i-1)
Case Else
ContinueLoop
EndSwitch
Next
EndFunc
|
评分
-
查看全部评分
|