实例3.8使用可选参数% K J2 z w' \3 Q
编写一个用于计算两个实数的和以及平均值的子过程,该子过程具有一个可选参数,在调用子过程时,如果不提供与可选参数对应的实参,或实参的值为0,则在窗体上只打印两个数的和;如果提供了一个不为0实参,则在窗体上还将打印出两个数的平均值。& z8 C3 W4 J3 |8 M6 j
具有可选参数的子过程的代码如下:; G% |# j& R4 C+ k! A0 \6 j: o
Private Sub(x As Single,y As Single,Optional n As Boolean=0)6 A5 p. ]' ]$ a
Dim s As Single,A As Single
: ~2 A7 |' V. o s=x=y6 X* I* V) x) c9 ~
A=S/2
5 X a, {( h* A If n=False Then
3 \& x4 Z. x; `# Q9 O+ k3 D Print“总和为:”& S9 Z8 {( X, d! g3 b! r# S
Else
0 i7 A) h4 x# Q8 `9 d9 t, l" a Print“总和为:”& S
7 ]4 V3 [4 \' R8 H Print“平均值为:”& A
% w# \, {3 p6 \2 P- s* Y/ q; U" } End If. p& s4 t, ]* M0 Z
End Sub
: K2 ^8 Y# s! d% d! V4 K8 W- B 在窗体的Click事件过程中调用子过程Sum.代码如下:6 r0 ~7 R _: ]+ e( P# k
Private Sub Form_Click()
- P) e( W5 w0 {4 n- O d Print “不提供与可选参数对应的实参”
3 L1 T8 p6 D7 G9 q) f1 E- \" G( ` Sun 6,9( A/ x9 Y8 ?, V& `) H
Print “提供与可选参数对应的实参,并且实参为0:”
, k/ h" H- o3 h7 ^" q Sun 6,9,0
; i* o+ [# c1 N1 [- h+ H' F- M Print 空行% e$ E' N4 c4 ]" [8 h
Print “提供与可选参数对应的实参,并且实参不为0:”
& J V( ~2 F. I. Z! C% g Sun 6,9,1
" X+ q$ r+ ]; Z& W# d ` End Sub: T/ X5 A! ~* y7 T
运行程序,单击窗体,结果如图3.25所示。
5 z6 h! U* r9 p9 b9 y) H6 w0 z' {$ J3 w$ P: i; |
7 ^$ |7 r7 U9 N$ \
递归是推理和问题求解的一种强有力方法,原因在于许多对象,特别是数学研究对象具有递归的结构。简单地说,如果通过一个对象自身的结构来描述或部分描述该对象就称为递归。最简单而易于理解的一个例子是阶乘的递归定义。如果以函数f(n〕表示自然数n的阶乘的道,则有定义:0 G# @8 W+ x* ?
递归定义使我们能够用有限的语句描述一个无穷的集合。本例描述一个无穷的集合只用了两个语句。* D2 C* o7 P* W X) n$ B/ ] ]
VB程序设计语言允许一个过程体有调用自身的语句,称为递归调用。也允许调用另一过程,而该过程又反过来调用本过程,称为间接递归调用。这种功能为求解具有递归结构的问题提供了强有力手段,使程序语言的描述与问题的自然描述完全一致,因而使程序易于理解,易于保证和维护。例如,对于上面的n阶乘的递归定义,可以写出相应的VB函数过程,如下面的实例3.9.这个过程的推理(计算)路线与原来函数的(递归)数学定义完全一致。: o. U2 O8 _ L/ ?
实例3.9求n阶乘的VB函数过程
/ [9 C& P S9 ~2 m( z9 \# z Private Function F(byval n As Integer) As Integer, I5 c7 U1 N1 D. Q9 ~
If n=1 Then7 w. y7 f4 c1 d) n% H. h9 { O# z
F=1
) ~, p* }, v' B" n Else- M& Y; e C! R! @: f7 E7 Z
F=n*F(n-1)+ g* p' l9 p7 [# I5 G) D- x# V J" O
End If
! q' |6 S" R) o6 j$ A$ S! P( q, X End Function
" q2 ^! j8 P4 B. U% u, x 让我们来跟踪这个程序的计算过程,令n=4调用这个函数,用下面的形式来表示递归求解的过程:2 \. f9 l( x" H, Y; h
(1)F(4)=4*F(3) n=4调用函数过程F(3)% ~# H% `! u: r3 O# P9 ^2 U& D
(2)F(3)=3*F(2) n=3调用函数过程F(2)
( k/ v* V- e( z# w (3)F(2)=2*F(1) n=2调用函数过程F(1)) w1 |6 X- U* L- V
(4)F(1)=1 n=1求的F(1)的值
2 O" o! o" j5 m9 e9 G+ m, j- t (5)F(2)=2*1=2 回归,n=2,求得F(2)的值4 W% B( F1 M7 `# g4 n
(6)F(3)=3*2=6 回归,n=3,求的F(3)的值- P! z, D' R5 Y4 W) |6 G O" f! N
(7)F(4)=4*6=24 回归,n=3,求得F(4)的值% \. w9 {, x. z6 @
上面第1步到第4步求出F(1)=1的步骤称为递推,从第4步到第7步求出F(4)=4*6的步骤称为回归。
! M; T" V: v+ U& f$ b @% P 从这个例子可以看出,递归求解有两个条件: s' ?, |" U8 g& _2 J
给出递归终止的条件和相应的状态。5 Q' I) k. H! |0 y2 \+ k2 [ i
在本例中递归终止的条件是n=1,状态是F(1)=1.! l( R. U' P, x
2.给出递归的表述形式,并且这种表述要向着终止条件变化,在有限步内达到终止条件。& N* U4 n9 Z2 T' D
在本例中,当n>l时,给出递归的表述形式为F(n)=n*F(n-1).函数值F(n)用函数值F(n-1)来表示。参数的值向减少的方向变化,在第n步出现终止条件n=1。 |