一步一步寫演算法(之爬樓梯)

2021-08-31 10:52:39 字數 1653 閱讀 1613

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

前兩天上網的時候看到乙個特別有意思的題目,在這裡和朋友們分享一下:

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

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

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

(1)首先我們建立乙個函式,判斷函式的合法性

void

jump_ladder

(int layer, int* stack, int* top)

(2)判斷當前的層數是為1或者是否為2

void

jump_ladder

(int layer, int* stack, int* top)

if(layer == 2) return;}

(3)對於2中提及的列印函式進行設計,**補全

#define general_print_message(x)\    do while(0)

void

printf_layer_one

(int layer, int* stack, int* top)

void

printf_layer_two

(int layer, int* stack, int* top)

注: a)**中我們使用了巨集,注意這是乙個do{}while(0)的結構,同時我們對x進行了字串強轉

b)當剩**階為2的時候,此時有兩種情形,要麼一次跳完;要麼分兩次

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

void _jump_ladder(int layer, int* stack, int* top, int decrease) void

jump_ladder

(int layer, int* stack, int* top)

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

祝:這裡在函式的結尾新增了乙個函式,主要是遞迴的時候需要向堆疊中儲存一些資料,為了**簡練,我們重新定義了乙個函式。

總結:

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

2)遞迴的函式也需要好好測試,使用不當,極容易堆疊溢位或者死迴圈。對此,我們可以按照引數從小到大的順序依次測試,比如說,可以測試樓梯為1、2、3的時候應該怎麼執行,同時手算和程式相結合,不斷修正**,完善**。

給我老師的人工智慧教程打call!

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法 之 A 演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...