題目描述
我們要求找出具有下列性質數的個數(包含輸入的自然數n):
先輸入乙個自然數n(n≤1000),然後對此自然數按照如下方法進行處理:
不作任何處理;
在它的左邊加上乙個自然數,但該自然數不能超過原數的一半;
加上數後,繼續按此規則進行處理,直到不能再加自然數為止.
輸入格式
1個自然數n(n≤1000)
輸出格式
1個整數,表示具有該性質數的個數。
輸入輸出樣例 6 6
滿足的數 6,16,26,126,36,136
這個題常規來想其實並不難,這是乙個很簡單的暴力遞迴
但題目要求是在1000之內, 暴力遞迴就會超時了
所以需要優化**,這裡採取記憶的方法(本人蒟蒻,請蒟蒻不要看到記憶二字退出)
#include
#include
int f[
1002]=
;//定義全域性陣列並賦值為零,用來判斷在遞迴的過程中有沒有曾計算過的值 解釋1:
intnum
(int n)
else
return f[n]
=sum;
//解釋二:
}else}}
intmain()
解釋1;例如在計算num(4)時,會呼叫num(2),這樣如果重複遞迴很麻煩,如果num(2)在此前出現過,則將它記錄下來,這樣可以大大減少計算量。
解釋2:注意這裡面每次返回的都是f(n),f(n)無論怎樣都曾經有過sum為其賦值。
關於遞迴,可能有些小夥伴不理解他是怎樣運作的東西,你們其實可以用中文解釋來思考,你們定義的函式究竟是乙個幹什麼的函式,例如此題中的num函式,你要知道這個函式的作用是什麼。num函式是乙個求出輸入n前面有多少種成立情況的函式,每次你遇到他時你就可以這麼想他。
如果不能完全理解上面這段話,可以參照漢諾塔問題,在列印方法時,用的是同一種思想。
數的計算 遞推 遞迴
我們要求找出具有下列性質數的個數 包含輸入的正整數 n 先輸入乙個正整數n n 1000 然後對此正整數按照如下方法進行處理 1.不作任何處理 2.在它的左邊加上乙個正整數,但該正整數不能超過原數的一半 3.加上數後,繼續按此規則進行處理,直到不能再加正整數為止。輸入n,輸出乙個整數 該整數我在 中...
對遞迴的簡單理解
今天一小夥伴寫了乙個遞迴,echo可以輸出要取的值,return的卻總是null,寫了乙個簡單的測試復原一下問題。function test i echo i return i a test 30 var dump a 結果如下 261014182226 int 26 思路看上去很簡單,i 3就遞迴...
遞迴演算法的簡單理解
遞迴演算法在我們的處理各種問題的時候大量的使用,是乙個可以將大型的問題簡單化的演算法 對遞迴的理解 遞迴在概念上籠統的來說就是自己呼叫自己的方法,就像是查字典一樣,一層一層的查,直到找到你想要的那個資料,然後再逐一的返回 遞迴的抽象化理解 其實遞迴可以理解為出棧入棧的形式,他執行第一步遞迴,就將函式...