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

  1. 編寫一個(gè)遞歸函數(shù)金句,實(shí)現(xiàn)將輸入的任意長度的字符串反向輸出的功能泪勒。例如輸入字符串ABC栅组,則輸出字符串CBA钮糖。
    代碼實(shí)現(xiàn):
void print(){
    char a;
    scanf("%c", &a);
    if(a != '#') print();
    if(a != '#') printf("%c", a);
}
  1. 漢諾塔問題
    一位法國數(shù)學(xué)家曾編寫過一個(gè)印度的古老傳說:在世界中心貝拿勒斯的圣廟里梅掠,一塊黃銅板上插著三根寶時(shí)針。印度教的主神梵天在創(chuàng)造世界的時(shí)候店归,在其中一根針上從下到上地穿好了由大到小的64片金片阎抒,這就是所謂的漢諾塔。不論白天黑夜消痛,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片:一次只移動(dòng)一片且叁,不管在那根針上,小片必須在大片上面秩伞。
    僧侶們語言逞带,但所有的金片都從梵天穿好的那根針上移到另外一根針時(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格的國際象棋上擺放八個(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)系作者
  • 序言:七十年代末迂烁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子递鹉,更是在濱河造成了極大的恐慌盟步,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏结,死亡現(xiàn)場(chǎng)離奇詭異却盘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)媳拴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門黄橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屈溉,你說我怎么就攤上這事塞关。” “怎么了子巾?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵帆赢,是天一觀的道長。 經(jīng)常有香客問我线梗,道長匿醒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任缠导,我火速辦了婚禮廉羔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僻造。我一直安慰自己憋他,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布髓削。 她就那樣靜靜地躺著竹挡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪立膛。 梳的紋絲不亂的頭發(fā)上揪罕,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天梯码,我揣著相機(jī)與錄音,去河邊找鬼好啰。 笑死轩娶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的框往。 我是一名探鬼主播鳄抒,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椰弊!你這毒婦竟也來了许溅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤秉版,失蹤者是張志新(化名)和其女友劉穎贤重,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體清焕,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡游桩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耐朴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盹憎,死狀恐怖筛峭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陪每,我是刑警寧澤影晓,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站檩禾,受9級(jí)特大地震影響挂签,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盼产,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一饵婆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戏售,春花似錦侨核、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锋喜,卻和暖如春些己,著一層夾襖步出監(jiān)牢的瞬間豌鸡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工段标, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涯冠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓怀樟,卻偏偏與公主長得像功偿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子往堡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容