函数在定义时可以调用其他的函数。输入并运行以下代码:
Sub fun1()
Print "a"
End Sub
Sub fun2()
fun1()
Print "a"
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
fun2()
Print "c"
End Sub
程序运行后输出:
a
b
c
程序运行流程如图11-2所示。

(1)代码首先从主函数开始运行,调用fun2()函数。
(2)进入fun2()函数内部。
(3)在fun2()内,首先调用fun1()函数。
(4)进入fun1()函数内部。
(5)在fun1()内,首先输出“a”。
(6)fun1()运行结束,返回到fun2()函数内部。
(7)在fun2()内部继续运行,输出“b”。
(8)fun2()运行结束,返回到main()函数内部。
(9)游戏执行过程()函数内部继续运行,输出“c”,End Sub 程序结束。
一个函数直接或间接地调用自身的形式被称为递归调用,比如,求一个整数n的阶乘n !=n(n-1)(n-2) 可以转换为递归调用的形式:

当n大于1时,n的阶乘等于n乘以n-1的阶乘;当n=1时,n的阶乘等于1。定义求阶乘函数fac()如下:
Function fac(n As Long) As Long
Dim f As Long
If n = 1 Then
f = 1
Else
f = n *fac(n -1)
End If
Function = f
End Function
Sub 游戏执行过程(hWndForm As hWnd)
Dim num As Long = fac(5)
Print "5!=" & num
End Sub
主函数中调用fac(5),程序运行后输出:5!=120
程序运行流程如图11-3所示。
(1)从主函数中调用fac(5)进入fac()函数内部,n=5,是大于1的,因此fac(5)=5*fac(4)。
(2)调用fac(4)进入fac()函数内部,n=4,是大于1的,因此fac(4)=4*fac(3)。
(3)调用fac(3)进入fac()函数内部,n=3,是大于1的,因此fac(3)=3*fac2)。
(4)调用fac(2)进入fac()函数内部,n=2,是大于1的,因此fac(2)=2*fac(1)。
(5)调用fac(1)进入fac()函数内部,n=1使得fac(1)=1,fac(1)运行结束。
(6)返回fac(2),即fac(2)=2fac(1)=21=2,fac(2)运行结束。
(7)返回fac(3),即fac(3)=3fac(2)=32=6,fac(3)运行结束。
(8)返回fac(4),即fac(4)=4fac(3)=46=24,fac(4)运行结束。
(9)返回fac(5),即fac(5)=5fac(4)=524=120,fac(5)运行结束。
(10)返回 游戏执行过程() 函数,最终输出120。
提示
要使用函数递归调用,首先需能写成递归调用的形式,比如,求n的阶乘可以转换为求n-1阶乘。另外需要有结束递归的条件,比如,n=1时结束求阶乘递归调用,否则程序会一直重复运行。
汉诺塔问题:有3根针A、B、C。A针上有n个盘子。盘子大小不等,大的在下,小的在上。要求将n个盘子从A针移到C针,可以借助B针,每次只许移动1个盘子,3根针上始终保持大盘在下小盘在上。

汉诺塔问题是可用递归求解的一个经典问题,将n个盘子从A针移到C针可分解为3个步骤。
(1)将A上n-1个盘子借助C针移到B针。
(2)将A针上剩下的一个盘子移到C针。
(3)将B针上的n-1个盘子借助A移到C针。
其中,1、3的操作是相同的,只是针的名称不同,因此3个步骤可分成两类操作:
(1)将n-1个盘子从一根针移到另一根针上(n>1);
(2)将一个盘子从一根针移到另一根针上。
分别用两个函数实现以上两个操作:
(1)hanoi(n,one,two,three)表示将n个盘子从one针借助two 移到three针;
(2)move(getone,putone) 表示将一个盘子从getone针移到putone针。
one、two、three、getone、putone都代表A、B、C之一,根据各次不同情况取A、B、C代入。
Sub move(x As String, y As String)
Print "move " & x & " To " & y
End Sub
Sub hanoi(n As Long, a As String, b As String, c As String)
If n = 1 Then
move(a, c)
Else
hanoi(n -1, a, c, b)
move(a, c)
hanoi(n -1, b, a, c)
End If
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
Dim n As Long =3
Print "3个盘子演示"
hanoi(n,"A","B","C")
End Sub
输入3,程序运行后输出3个盘子的汉诺塔问题操作步骤:

评论一下?