VBA入门到进阶常用知识代码总结46

第46集 组合之递归算法
203、 递归基础
1 什么是递归?
递归就是自已调用自已。
2 用递归有什么好处?
简化代码,让程序更简捷。特别是在循环层数不定的情况下可以大大简单代码。
3 递归有什么坏处?
因为递归在使用时会产生大量储存临时信息的“栈”(按先进先出储存信息),所以运行效果比较低,所以一般不建议使用递归设计程序。
204、 示例
计算4的阶乘 (4 * 3 * 2 * 1 = 24)
Sub 一般方法()
Dim k, x
k = 1
For x = 4 To 1 Step -1
k = k * x
Next x
MsgBox k
End Sub

递归方法计算阶乘:
Sub 递归1()
MsgBox jiecheng(5)
End Sub

'函数法
Function jiecheng(n As Integer) As Integer
If n = 1 Then
jiecheng = 1
Else
jiecheng = n * jiecheng(n - 1)
End If
End Function

组合问题:
在这里插入图片描述
Option Explicit
Dim arr1(1 To 100, 1 To 1) '把分组后的结果放在arr1中
Dim k As Integer '作为arr1填充时的行数
Sub 组合()
Dim arr
k = 0
Erase arr1
arr = Range(“a2:a” & Range(“a65536”).End(xlUp).Row)
zuhe arr, 1, “”, 0
Range(“c2”).Resize(100) = “”
Range(“c2”).Resize(k) = arr1
End Sub

Sub zuhe(arr, x, sr, y)
'arr 把源数组导入子过程
'x 递归的索引号
'sr 连接的字符串
'y 连接的次数
If y = [b2] Then
k = k + 1
arr1(k, 1) = sr
Exit Sub
End If

If x < UBound(arr) + 1 Then
  zuhe arr, x + 1, sr & arr(x, 1), y + 1
  zuhe arr, x + 1, sr, y
End If

End Sub

求和问题
在这里插入图片描述
Option Explicit
Dim arr1(1 To 10000, 1 To 1) As String '公式表达式放在arr1中
Dim k As Integer '作为arr1填充时的行数
Dim g As Integer, h As Integer
Dim arr
Dim k1
Sub 组合()
k = 0
Dim t
t = Timer
Erase arr1
arr = Range(“a2:a” & Range(“a65536”).End(xlUp).Row)
g = [b2]
h = [c2]
zuhe 1, 0, “”, 0
Range(“d2”).Resize(k) = arr1
[e1] = k1
MsgBox “找到 " & k & " 个解! 花费” & Format(Timer - t, “0.00”) & “秒”
End Sub

Sub zuhe(x%, z%, sr$, gg As Byte)
If z + arr(x, 1) = h And gg = g - 1 Then
k = k + 1
arr1(k, 1) = sr & arr(x, 1) & “=” & h
Exit Sub
End If
If x < UBound(arr) And z < h Then
If z + arr(x, 1) < h Then
zuhe x + 1, z + arr(x, 1), sr & arr(x, 1) & “+”, gg + 1
End If
zuhe x + 1, z, sr, gg
End If
End Sub

Sub 循环法()
Dim x As Integer
Dim y As Integer
Dim z As Integer
Dim t
Dim arr(1 To 1000, 1 To 1) As String
Dim q As Long, q1 As Long
t = Timer
For x = 1 To 97
For y = x + 1 To 98
For z = y + 1 To 99
q1 = q1 + 1
If x + y + z = 54 Then
q = q + 1
arr1(q, 1) = x & “+” & y & “+” & z & “=54”
End If
Next z, y, x
Range(“e2”).Resize(10000) = “”
Range(“e2”).Resize(q) = arr1
MsgBox Timer - t
End Sub

发布了47 篇原创文章 · 获赞 0 · 访问量 129

猜你喜欢

转载自blog.csdn.net/tiansdk320/article/details/104365885
今日推荐