VisualFreeBasic游戏趣味编程_11.1_递归

2026-1-22 / 0 评论 / 64 阅读

函数在定义时可以调用其他的函数。输入并运行以下代码:

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个盘子的汉诺塔问题操作步骤:

评论一下?

OωO
取消