數據結構:遞歸

 

1.定義算法

  一個函數直接或間接的調用本身函數

 2.舉例blog

  1)求階乘遞歸

  2)1+2+3+4+……+10原理

  3)漢諾塔循環

  4)走迷宮im

(1)(2)求階乘,求累加db

 a.循環解決img

int main()
{
    int val;
    int i, mult = 1;
    printf("請輸入一個數字:");
    printf("val = ");
    scanf("%d", &val);
    for (i=1; i<=val; i++)
    {
        mult = mult * i;
    }
    printf("%d的階乘是%d",val, mult);
    return 0;
}移動

   b.遞歸解決

//假定n的值是1或者大於1的值
long f(long n)
{
    if (1 == n)
    {
        return 1;
    }
    else
    {
        return f(n-1) * n;  //若是求的是累加 則return f(n-1) + n
    }
}


int main()
{
    int n;
    printf("請輸入一個數字:");
    printf("n = ");
    scanf("%d", &n);

    printf("%d的階乘是%d",n, f(n));
    return 0;
}

(3)漢諾塔

   僞算法

    先把A柱子上的前n-1個盤子從A藉助C移到B

    將A柱子上的第n個盤子直接移到C

    再將B柱子上的n-1個盤子藉助A移到C

 代碼實現
void hanoi(int n, char A, char B, char C)
{
    /*

 次數爲2的n次方減1次
    若是是一個盤子
        直接將A柱子上的盤子移動到C柱子上
    否者
        先將A柱子上的n-1個盤子藉助C移動到B柱子
            A       B      C
            n-1 ->      ->n-1
                     n-1  <-n-1
            n-1->  n-1

        再將A柱子上的盤子從A移到C
            A         C

        結果第n個  -> 第n個
        最後將B柱子上的n-1個盤子藉助A移到C
            A      B      C
            n-1  <-n-1
            n-1           ->n-1
               n-1    ->n-1
    */
    if (1 == n)
    {
        printf("將編號爲%d的盤子直接從%c柱子移動到%c柱子\n",n, A, C);
    }
    else
    {
        hanoi(n-1, A, C, B);
        printf("將編號爲%d的盤子直接從%c柱子移動到%c柱子\n",n, A, C);
        hanoi(n-1, B, A, C);
    }
}

int main()
{

    int n;

    printf("請輸入要移動盤子的個數:");
    scanf("%d",&n);

    hanoi(n, 'A', 'B', 'C');
    return 0;
}

3.原理

 

  

 

  間接調用

    f()調用g(),g()調用k()

  本身調用

    f(n)調用f(n-1),f(n-1)調用f(n-2),一直到沒法調用爲止

4.循環和遞歸區別

  遞歸

    易於理解

    速度慢

    存儲空間大

  循環

    不易理解

    速度快

    存儲空間小

相關文章
相關標籤/搜索