遞歸思想的應(yīng)用

  1. 編寫一個(gè)遞歸函數(shù),實(shí)現(xiàn)將輸入的任意長(zhǎng)度的字符串反向輸出的功能。例如輸入字符串ABC,則輸出字符串CBA。
    代碼實(shí)現(xiàn):
void print(){
    char a;
    scanf("%c", &a);
    if(a != '#') print();
    if(a != '#') printf("%c", a);
}
  1. 漢諾塔問題
    一位法國(guó)數(shù)學(xué)家曾編寫過(guò)一個(gè)印度的古老傳說(shuō):在世界中心貝拿勒斯的圣廟里,一塊黃銅板上插著三根寶時(shí)針。印度教的主神梵天在創(chuàng)造世界的時(shí)候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片:一次只移動(dòng)一片,不管在那根針上,小片必須在大片上面。
    僧侶們語(yǔ)言,但所有的金片都從梵天穿好的那根針上移到另外一根針時(shí),世界就將在一聲霹靂中消滅,而梵塔,廟宇和眾生也都將同歸于盡。
圖片.png

問題的實(shí)現(xiàn)主要考慮下面三個(gè)步驟:

  • 先將前63個(gè)盤子移動(dòng)到Y(jié)上,確保大盤在小盤下。
  • 再將最底下的64個(gè)盤子移動(dòng)到Z上。
  • 最后將Y上的63個(gè)盤子移動(dòng)到Z上。
    代碼實(shí)現(xiàn)如下:
#include <stdafx.h>
#include <stdio.h> 
void hannuotai(int n, char A, char B, char C) {
    /*
    如果是1個(gè)盤子
        直接將A柱子上的盤子從A移動(dòng)到C
    否則
        將A柱子上的n-1個(gè)盤子借助C移動(dòng)到B
        直接將A柱子上的盤子從A移動(dòng)到C
        最后將B柱子上的n-1個(gè)盤子借助A移動(dòng)到C
    */
    if (1 == n)
    {
        printf("將編號(hào)為%d的盤子直接從%c柱子移動(dòng)到%c柱子\n", n, A, C);
    }
    else
    {
        hannuotai(n - 1, A, C, B);
        printf("將編號(hào)為%d的盤子直接從%c柱子移動(dòng)到%c柱子\n", n, A, C);
        hannuotai(n - 1, B, A, C);
    }
}
int main(void) { 
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
    int n;
    printf("請(qǐng)輸入要移動(dòng)盤子的個(gè)數(shù):");
    scanf_s("%d", &n);
    hannuotai(n, 'A', 'B', 'C');
    getchar();
    getchar();
    return 0;
}
  1. 八皇后問題
    這個(gè)問題是十九世紀(jì)著名的數(shù)學(xué)家高斯1850年提出:
    在8x8格的國(guó)際象棋上擺放八個(gè)皇后,使其不能互相攻擊,即在任意兩個(gè)皇后都不能處于同一行,同一列或同一斜線上,問有多少種擺法。
    正確答案是92種擺法。
    其中一種解法如下:
圖片.png

代碼實(shí)現(xiàn):

#include<stdafx.h>
#include<stdio.h>

int count = 0;

int notDanger(int row, int j, int(*chess)[8]) {
    
    int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
    //判斷列方向
    for (i = 0; i < 8; i++)
    {
        if (*(*(chess + i) + j) != 0)
        {
            flag1 = 1;
            break;
        }
    }
    //判斷左上方
    for (i = row, k = j; i >= 0 && k >= 0; i--, k--)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag2 = 1;
            break;
        }
    }
    //判斷右下方
    for (i = row, k = j; i < 8 && k < 8; i++, k++)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag3 = 1;
            break;
        }
    }
    //判斷右上方
    for (i = row, k = j; i >= 0 && k < 8; i--, k++)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag4 = 1;
            break;
        }
    }
    //判斷左上方
    for (i = row, k = j; i < 8 && k >= 0; i++, k--)
    {
        if (*(*(chess + i) + k) != 0)
        {
            flag5 = 1;
            break;
        }
    }

    if (flag1 || flag2 || flag3 || flag4 || flag5)
    {
        return 0;
    }
    else
    {
        return 1;
    }
    
}

//參數(shù)row:表示起始行
//參數(shù)n:表示列數(shù)
//參數(shù)(*chess)[8]:表示指向棋盤每一行的指針
void EightQueen(int row, int n, int(*chess)[8]) {
    int chess2[8][8], i, j;
    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 8; j++)
        {
            chess2[i][j] = chess[i][j];
        }
    }
    if (8 == row)
    {
        printf("第 %d 種", count + 1);
        for (i = 0; i < 8; i++)
        {
            for (j = 0; j < 8; j++)
            {
                printf("%d", *(*(chess2 + i) + j));
            }
            printf("\n"); 
        }
        count++;
    }
    else
    {
        //判斷這個(gè)位置是否有危險(xiǎn)
        //如果沒有危險(xiǎn)?繼續(xù)往下判斷
        for (j = 0; j < n; j++)
        {
            if (notDanger(row, j, chess)) {//判斷這個(gè)位置是否有危險(xiǎn)
                for (i = 0; i < 8; i++)
                {
                    *(*(chess2 + row) + i) = 0;
                }
                *(*(chess2 + row) + j) = 1;
                EightQueen(row + 1, n, chess2);
            }
        }
    }

}

int main() {

    int chess[8][8], i, j;
    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 8; j++)
        {
            chess[i][j] = 0;
        }
    }
    EightQueen(0, 8, chess);

    printf("總共有%d種解決方法!\n", count);

    getchar();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容