|
楼主 |
发表于 2013-9-2 09:14
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 lee1892 于 2013-9-2 12:58 编辑
参考答案:
[code=vb]Private oDic As Object
Sub ChangeCoin()
Dim aCoins(), aRes(), nCoin, t#
' 可更改段
Dim i%
' 只能是Dim
' 可更改结束
aCoins = Array(12, 123, 1000, 50000, 600000, 30000000, 10 ^ 9)
ReDim aRes(UBound(aCoins))
t = Timer
' 可更改段
Set oDic = CreateObject("Scripting.Dictionary")
For Each nCoin In aCoins
aRes(i) = Exchange(nCoin)
i = i + 1
Next
oDic.RemoveAll: Set oDic = Nothing
' 可更改结束
Debug.Print "ID: " & "Lee1892"
Debug.Print "Result: " & Join(aRes, ", ")
Debug.Print "Time: " & Format(Timer - t, "0.000s")
End Sub
Function Exchange@(ByRef nCoin)
Dim nSum@
If nCoin = 0 Then Exchange = 0: Exit Function
If oDic.Exists(nCoin) Then
Exchange = oDic(nCoin)
Else
nSum = Exchange(nCoin \ 2) + Exchange(nCoin \ 3) + Exchange(nCoin \ 4)
Exchange = IIf(nCoin >= nSum, nCoin, nSum)
oDic(nCoin) = Exchange
End If
End Function[/code]
再追加一句,代码自证应该是如上的方式,即判断 上述代码中的 nSum 与 nCoin 的大小,而不是 nCoin\2 + nCoin\3 + nCoin\4,或言先递归后判断而不是先判断后递归。
所以严格意义上而言,没有人是确实做到代码自证的,呵呵~
=================
可以考虑一下如果将2、3、4换成别的数字,各位的代码需要如何改动呢?比如2、3、5,又或则是2、3、3,嗯嗯~
|
|