递归——自己调用自己
-
递归的定义
1:故事:
大家都听过老和尚讲的故事吧,从前有座山,山上有座庙,庙里有个老和尚,老和尚在讲故事给小和尚听:"从前有座山,山上有座庙,庙里有个老和尚,老和尚在讲故事给小和尚听:'从前座山,山上有座庙,庙里有个老和尚,老和尚在讲故事给小和尚听.........",
这就是生活中一个用递归形成的故事。
2:德罗斯特效应
3:定义:递归(Recursion),是指在函数的定义中又调用函数自身的方法。
递归分为递推、回归两个过程,递推过程把数据不断地压进堆栈,我们知道堆栈是先进后出,当递推到初始条件时,开始回归,调取保存在堆栈中的数据,最好得到所求结果。
-
递归求阶乘
我们知道阶乘的算法,例如求5!=5*4*3*2*1,运用递归即我们要知道5!的值,必需先知道5!——>4!——>3!——>2!——>1!,而所有阶乘的初始条件都为1!=1,此过程称为递推,我们总共递推了4次,知道初始条件1!=1,我们开始回归,1!——>2!——>3!——>4!——>5!,具体步骤如下图所示:
C#:
// private static int jj = 0;// static long Recusion(long n)
long lngReturn = 1;
//(递归结束条件 {
ii++;
第次递推:n=" + n);
lngReturn = n * Recusion(n - 1);
jj++;
第次回归:lngReturn=" + lngReturn);
return lngReturn;
VB.NET:
递归求阶乘
Dim lngReturn As Long = 1
递推次数计数
回归次数计数
Then
Console.WriteLine("" & ii & "n=" & n)
jj += 1
第"lngReturn=" & lngReturn)
Return lngReturn
运行结果显示如下:
使用普通方式求递归:
C#:
{
long lngReturn = 1;
for (int i = 0; i < n; i++)
lngReturn *=(i+1) ;
return lngReturn;
Function P_Recusion(n As Long) As Long
For i = 1 To n
Next
(2):递归的缺点:递归方法的运行效率不高。
-
递归求最大公约数
1:最大公约数:最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。
2:例如求45,30的最大公约数。最常用的即:辗转相除法。即用45/30,若不整除,则用35/(两数的余数),直到余数为0。
C#:
辗转相除法求最大公约法
{
保存较大数,保存较小数
//m<n {
int temp=0;
temp = m;
m=n;
n=temp;
int r = m % n;
两数整数整除,则返回较小数 {
return n;
else//0
return gcd(n, r);
}
VB.NET:
辗转相除法求最大公约数
'mn If (m < n) Then 'm<n Dim temp As Integer = 0
m = n
End If
If (r = 0) Then 'n
Else '0
End If
End Function
-