递归的函数过程--回归到自身开头的位置,再进行。
递归是人们在解决问题时用到的一种方法。不少问题本身具有这种特性。
如求阶乘,设一个具有递归功能的函数:fac(n)=n!
Public Function fac(n as Integer) As Long
If n=1 then
fac=1
Else
fac=n*fac(n-1)
End If
End Function
Private Sub Command1_Click()
Dim k As Integer
k=InputBox("求阶乘N!,输入N","给定",4)
Print k;"的阶乘";k;"!=";fac(k)
End Sub
算法依据是:n!=n*(n-1)!,其中(n-1)!=(n-1)*(n-2)!所以,可以作出递归的定义:fac=n*fac(n-1),即在等号右边先计算fac(n-1)时,递归调用了(n-1)*fac(n-2),...一直到最后出现fac(1)=1结束递归条件为止。
所以,一要规定递归结束时的值;二要用递归形式表示,并且递归向终止条件行进。
递归对于求级数、指数的运算有特殊效果,阶乘就是相乘的级数
--------------------------------------------------------------------------------
函数的递归调用,是人们在解决问题中需要引入的方法。但是,在一件事未终结之前,又回到开头,有可能造成无限制的回复。程序设计必须避免这种难堪的结果。我们可以用if语句来控制,即在某种条件下,才可以做递归,否则就不再继续了。
下面举另一个例子:5个人依次坐在一排。问第5个人几岁?他说比第4个人大2岁。第4、3、2个人都说比相邻的大2岁。最后问第1个人,是10岁。求:第5个人是几岁?
Public Function Age(n as Integer) as Integer
if n=1 then
Age=10 '第五次回的是10
Else
Age=Age(n-1)+2 '第二次返回Age(3)+2,第三次回的是Age(2)+2 ,第四次回的是Age(1)+2
End If
End Function
Private Sub Command1_Click()
Print "No5 Age=";Age(5) '第一次返回Age(4)+2,...在第五次返回后是10+2+2+2+2=18
End Sub
--------------------------------------------------------------------------------
以上是递归。递推是从已知的事实出发。下面是求黄金分割的程序:
Private Sub Command1_Click()
Dim a(50) As Long, i As Integer, x As Double, y As Double
i = 1: a(0) = 0: a(1) = 1: x = 0: Text1.Text = ""
ag:
i = i + 1: a(i) = a(i - 1) + a(i - 2): y = a(i - 1) / a(i)
Text1.Text = Text1.Text + Str(i) + "--" + Str(y) + vbCrLf
If Abs(x - y) >= 0.000000000000001 Then x = y: GoTo ag
Print "共计算到第"; i; "位。"
End Sub