在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 爬樓梯
hash表
單詞統(tǒng)計
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回數(shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個數(shù)統(tǒng)計

爬樓梯

前兩天上網(wǎng)的時候看到一個特別有意思的題目,在這里和朋友們分享一下:

有一個人準(zhǔn)備開始爬樓梯,假設(shè)樓梯有n個,這個人只允許一次爬一個樓梯或者一次爬兩個樓梯,請問有多少種爬法?

在揭曉答案之前,朋友們可以自己先考慮一下:

這個人爬n層樓梯,那么它也不是一下子就可以爬這么高的,他只有兩個選擇,要么從n-2層爬過來,要么從n-1層爬過來。除此之外,他沒有別的選擇。此時相信朋友其實已經(jīng)早看出來了,這就是一道基本的遞歸題目。

(1)首先我們建立一個函數(shù),判斷函數(shù)的合法性

void jump_ladder(int layer, int* stack, int* top)
{
    if(layer <= 0)
        return;

    return;
}

(2)判斷當(dāng)前的層數(shù)是為1或者是否為2

void jump_ladder(int layer, int* stack, int* top)
{
    if(layer <= 0)
        return;

    if(layer == 1){
        printf_layer_one(layer, stack, top);
        return;
    }

    if(layer == 2){
        printf_layer_two(layer, stack, top);
        return;
    }

    return;
}

(3)對于2中提及的打印函數(shù)進行設(shè)計,代碼補全

#define GENERAL_PRINT_MESSAGE(x)
    do {
        printf(#x);
        for(index = (*top) - 1 ; index >= 0; index --)
            printf("%d", stack[index]);
        printf("n");
    }while(0)

void printf_layer_one(int layer, int* stack, int* top)
{
    int index ;
    GENERAL_PRINT_MESSAGE(1);
}

void printf_layer_two(int layer, int* stack, int* top)
{
    int index;

    GENERAL_PRINT_MESSAGE(11);
    GENERAL_PRINT_MESSAGE(2);
}

注:

a)代碼中我們使用了宏,注意這是一個do{}while(0)的結(jié)構(gòu),同時我們對x進行了字符串強轉(zhuǎn)

b)當(dāng)剩下臺階為2的時候,此時有兩種情形,要么一次跳完;要么分兩次

(4)當(dāng)階梯不為1或者2的時候,此時需要遞歸處理

void _jump_ladder(int layer, int* stack, int* top, int decrease)
{
    stack[(*top)++] = decrease;
    jump_ladder(layer, stack, top);
    stack[--(*top)] = 0;
}

void jump_ladder(int layer, int* stack, int* top)
{
    if(layer <= 0)
        return;

    if(layer == 1){
        printf_layer_one(layer, stack, top);
        return;
    }

    if(layer == 2){
        printf_layer_two(layer, stack, top);
        return;
    }

    _jump_ladder(layer- 1, stack, top, 1);
    _jump_ladder(layer- 2, stack, top, 2);
}

祝:這里在函數(shù)的結(jié)尾添加了一個函數(shù),主要是遞歸的時候需要向堆棧中保存一些數(shù)據(jù),為了代碼簡練,我們重新定義了一個函數(shù)。

總結(jié):

1)這道題目和斐波那契數(shù)列十分類似,是一道地地道道的遞歸題目

2)遞歸的函數(shù)也需要好好測試,使用不當(dāng),極容易堆棧溢出或者死循環(huán)。對此,我們可以按照參數(shù)從小到大的順序依次測試,比如說,可以測試樓梯為1、2、3的時候應(yīng)該怎么運行,同時手算和程序相結(jié)合,不斷修正代碼,完善代碼。