递归——自己调用自己(上)

递归——自己调用自己

  1. 递归的定义

    1:故事:

    大家都听过老和尚讲的故事吧,从前有座山,山上有座庙,庙里有个老和尚,老和尚在讲故事给小和尚听:"从前有座山,山上有座庙,庙里有个老和尚,老和尚在讲故事给小和尚听:'从前座山,山上有座庙,庙里有个老和尚,老和尚在讲故事给小和尚听.........",

这就是生活中一个用递归形成的故事。

2:德罗斯特效应

3:定义递归(Recursion),是指在函数的定义中又调用函数自身的方法。

递归分为递推回归两个过程,递推过程把数据不断地压进堆栈,我们知道堆栈是先进后出,当递推到初始条件时,开始回归,调取保存在堆栈中的数据,最好得到所求结果。

  1. 递归求阶乘

    我们知道阶乘的算法,例如求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. 递归求最大公约数

      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

原文地址:https://www.cnblogs.com/lcword/p/14410010.html