经典算法
Access程序设计——递归(重复)
2017-07-28 14:05:36

递归的函数过程--回归到自身开头的位置,再进行。递归是人们在解决问题时用到的一种方法。不少问题本身具有这种特性。如求阶乘,设一个具有递归功能的函数:fac(n)=n!Public Function fac(n as Integer) As Long  If n=1 then   fac=1  Else   fac=n*fac(n-1)  End IfEnd FunctionPrivate 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 Integerif n=1 then  Age=10  '第五次回的是10Else  Age=Age(n-1)+2  '第二次返回Age(3)+2,第三次回的是Age(2)+2 ,第四次回的是Age(1)+2End IfEnd FunctionPrivate Sub Command1_Click()Print "No5 Age=";Age(5)       '第一次返回Age(4)+2,...在第五次返回后是10+2+2+2+2=18End 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