記憶性遞迴

2021-10-01 13:57:48 字數 1026 閱讀 1003

遞迴有時候會出現重複計算的情況(如下例題),因此為了提高**效率,就需要進記憶性遞迴——即只對第一次出現的新資料進行計算並進行儲存,而對於已經計算過的結果,只需將結果取出即可。(它可以提高效率,避免計算機進行重複已做過的完全相同的工作而降低效率)

例1:要求找出具有下列性質數的個數(包含輸入的自然數n):

先輸入乙個自然數n(n≤1000),然後對此自然數按照如下方法進行處理:

不作任何處理;

在它的左邊加上乙個自然數,但該自然數不能超過原數的一半;

加上數後,繼續按此規則進行處理,直到不能再加自然數為止.

輸入格式

1個自然數n(n≤1000)

輸出格式

1個整數,表示具有該性質數的個數。

樣例:

輸入 #1

6輸出 #1

6

#include

int f[

1002]=

;int

num(

int n)

else

return f[n]

=sum;

}else}}

intmain()

例2:

斐波那契數列:

#include

int f[

100]=;

intfibonacci

(int n)

}int

main()

再來看看遞迴的斐波那契數列寫法:(當然還有陣列迴圈的寫法也比遞迴更有效率)

#include

intfibonacci

(int n)

intmain()

printf

("\n");

return0;

}

總結:遞迴不一定提高效率。它優點在於,將複雜問題簡單化,「大事化小,小事易做」。

記憶性遞迴

初學者一般都會在斐波那契數列那裡學到遞迴,但其實如果計算斐波那契數列達到40以上的時候,普通的遞迴會很慢。例如計算第40位的斐波那契數,普通的遞迴花費大約2s,而記憶性遞迴則需1s就可完成計算。原因在於普通的遞迴計算f 5 時需要計算f 4 f 3 計算f 4 時還需要計算f 3 f 2 但是計算f...

記憶性遞迴

斐波那契數列指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n 1.普通斐波那契數列解法 1 include2 include3 using namespace std ...

藍橋杯 地宮取寶 記憶性遞迴

地宮取寶 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中...