遞迴 數的計算的簡單理解

2021-10-01 07:01:48 字數 1013 閱讀 8416

題目描述

我們要求找出具有下列性質數的個數(包含輸入的自然數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就遞迴...

遞迴演算法的簡單理解

遞迴演算法在我們的處理各種問題的時候大量的使用,是乙個可以將大型的問題簡單化的演算法 對遞迴的理解 遞迴在概念上籠統的來說就是自己呼叫自己的方法,就像是查字典一樣,一層一層的查,直到找到你想要的那個資料,然後再逐一的返回 遞迴的抽象化理解 其實遞迴可以理解為出棧入棧的形式,他執行第一步遞迴,就將函式...