6.5 递归P145
一个函数在内部自己再次调用自己(循环)
例:猴子摘桃子问题, tz(1)=(tz(2)+1)*2
Tz(n)=(tz(n+1)+1)*2
Private Sub Command1_Click()
Print tz(9)
Print tz(8)
Print tz(1)
End Sub
Private Function tz(n As Integer) As Integer
If n = 10 Then
tz = 1
Else
tz = (tz(n + 1) + 1) * 2
End If
End Function
例,求jc(n)=n!
Jc(n)=n*jc(n-1)
Private Sub Command1_Click()
Print jc(1)
Print jc(5)
End Sub
Private Function jc(n As Integer) As Long
If n = 1 Then
jc = 1
Else
jc = n * jc(n - 1)
End If
End Function
6.6 变量作用域范围与生命期
1 局部变量
Prvaite 或dim 定义的,在过程/函数内部首次定义的变量(仅作用于本过程/函数内部,外部不能引用)
在一个窗体的首部的“通用”处用private或dim定义的变量(可作用于本窗体所有过程/函数)
例:
Private m As Integer '窗体级变量
Public x As Integer 'x不但本窗体可用,其它窗体也可引用
Private Sub Command1_Click()
Dim n As Integer
n = 100 '过程局部变量
m = m + 1
Print n, m
x = x + 10
Print x
kk = 100
x1 = 1000
End Sub
Private Sub Command2_Click()
Dim n As Integer
n = 200 '过程局部变量
m = m + 1
Print n, m
x = x + 10
Print x
x1 = x1 + 1000
End Sub
Private Sub Command3_Click()
Form2.Show
End Sub
2 全局变量:(1)上例中在通用处定义的public 变量
注意:全局变量不能定义在过程/函数内部的
(2)模块级全局变量
工程---添加模块(模块是程序运行自动先运行的一段初始化准备程序)
注意:如果过程/函数内重新定义了外部的或全局的同名变量,则本过程内部以自定义的变量为准,屏蔽外面其它同名变量
Private Sub Command4_Click()
Dim x1 As Integer '自定义一个x1,屏蔽掉模块中x1
x1 = x1 + 10
Dim m As Integer '自定义一个m,屏蔽通用中的m
m = m + 1
Print x1, m ’10 1
End Sub ‘x1和m与外面无关
3 静态变量
引例:
Private Sub Command1_Click()
Call t1(3)
End Sub
Private Sub t1(n As Integer)
Dim s As Integer
s = s + n
Print s
End Sub 输出3(调用t1时传n,输出n)
例:Private Sub Command1_Click()
Call t1(3)
End Sub
Private Sub t1(n As Integer)
Static s As Integer
s = s + n
Print s
End Sub
多次点击按钮,得3,6,9….
Static变量在过程结束时,不消失,要保留本次计算的结果,供下次接着使用
Private Sub Command1_Click()
's=1+(1+2)+(1+2+3)+...(1+2+3+4+5)
Dim i As Integer
s = 0
For i = 1 T o 5
s = s + t1(i)
Next i
Print s
End Sub
Private Function t1(n As Integer) As Long Static s As Integer
s = s + n
t1 = s
End Function
6.7 过程示例P149
6-4 :
Dim a(10) As Integer
Private Sub Command1_Click()
For i = 1 T o UBound(a)
a(i) = Int(Rnd() * 999) + 1
Next i
For i = 1 T o 10
Print (a(i) - min(a)) / (max(a) - min(a)) Next i
End Sub
Function max(a() As Integer) As Integer max = a(1)
For i = 1 T o UBound(a)
If a(i) > max Then max = a(i)
Next i
End Function
Function min(a() As Integer) As Integer min = a(1)
For i = 1 T o UBound(a)
If a(i) < min Then min = a(i)
Next i
End Function
Private Sub Command2_Click()
End Sub
例6-6 升序数
Private Sub Command1_Click()
Dim a(10) As Long
For i = 1 T o UBound(a)
a(i) = Int(Rnd() * 1000) + 100
Print a(i), sx(a(i))
Next i
End Sub
Function sx(n As Long) As Boolean
f = True '假设x是升序数
s = Trim(Str(n))
For i = 1 T o Len(s) - 1
If Mid(s, i + 1, 1) <= Mid(s, i, 1) Then
f = False
Exit For
End If
Next i
sx = f
End Function
方法2: 只改写sx函数(类似于素数判断)Function sx(n As Long) As Boolean
s = Trim(Str(n))
For i = 1 T o Len(s) - 1
If Mid(s, i + 1, 1) <= Mid(s, i, 1) Then Exit For Next i
If i > Len(s) - 1 Then
sx = True
Else
sx = False
End If
End Function
例子6-7
Private Sub Command1_Click()
Dim a(10) As Integer
For i = 1 T o UBound(a)
a(i) = Int(Rnd() * 100) + 10
Print a(i);
Next i
Call sort(a)
For i = 1 T o UBound(a)
Print a(i);
Next i
End Sub
Private Sub sort(a() As Integer)
k = 1
For i = 2 T o UBound(a)
x = a(i) '把x插入到已经有k个有序数据的数组a中
For j = k T o 1 Step -1 '从右向左把大于x的数向右移动一位
If a(j) > x Then
a(j + 1) = a(j)
Else '发现第一个小于或等于x的数
Exit For '退出,此退出时的位置的后面就是x应该的位置End If
Next j
a(j + 1) = x '插入数x
k = k + 1 '有序数列的数多一个
Next i
End Sub
例6-9 未完成
Private Sub Command1_Click()
Call ss("abc")
End Sub
Sub ss(s As String)
If Len(s) = 1 Then
Print s
Else
ss (Mid(s, 1, Len(s) - 1))
End If
End Sub