您好,登錄后才能下訂單哦!
遞歸:無限調(diào)用自身這個函數(shù),每次調(diào)用總會改動一個關(guān)鍵變量,直到這個關(guān)鍵變量達(dá)到邊界的時候,不再調(diào)用。
個人理解就是自己調(diào)用自己,直到滿足一個條件結(jié)束自己調(diào)用自己的過程,這個就是遞歸。舉一個通俗的點(diǎn)的例子:
假設(shè)你在一個電影院,你想知道自己坐在哪一排,但是前面人很多,你懶得去數(shù)了,于是你問前一排的人「你坐在哪一排?」,這樣前面的人 (代號 A) 回答你以后,你就知道自己在哪一排了——只要把 A 的答案加一,就是自己所在的排了,不料 A 比你還懶,他也不想數(shù),于是他也問他前面的人 B「你坐在哪一排?」,這樣 A 可以用和你一模一樣的步驟知道自己所在的排。然后 B 也如法炮制,直到他們這一串人問到了最前面的一排(或者說問到了知道自己是哪一排的人,預(yù)示著調(diào)用結(jié)束),第一排的人告訴問問題的人「我在第一排」,最后大家就都知道自己在哪一排了
迭代:是重復(fù)反饋過程的活動,其目的通常是為了逼近所需目標(biāo)或結(jié)果。
每一次對過程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會作為下一次迭代的初始值。在Java中,我們使用接口機(jī)制來指定一個類所必須實(shí)現(xiàn)的方法。對于可迭代的集合數(shù)據(jù)類型,Java以及為我們定義了所需的接口。
2.1構(gòu)成遞歸需具備的條件:
2. 不能無限制地調(diào)用本身,須有個出口,化簡為非遞歸狀況處理。
第一:每一級的函數(shù)調(diào)用都有自己的變量。
第二:每一次函數(shù)調(diào)用都會有一次返回。
第三:遞歸函數(shù)中,位于遞歸調(diào)用前的語句和各級被調(diào)用函數(shù)具有相同的執(zhí)行順序。
第四:遞歸函數(shù)中,位于遞歸調(diào)用后的語句的執(zhí)行順序和各個被調(diào)用函數(shù)的順序相反。
第五:雖然每一級遞歸都有自己的變量,但是函數(shù)代碼并不會得到復(fù)制。
這個遞歸函數(shù)的功能是什么,怎樣調(diào)用這個函數(shù),即設(shè)計好遞歸函數(shù)的返回值和參數(shù)列表
什么時候應(yīng)該結(jié)束這個遞歸,它的邊界條件(出口)是什么(邊界條件)
int f(int n) {
//出口
if (n > 0) {
return n + f(n - 1);
} else {
return 0;
}
}
遞歸遞歸,有遞就得有歸(出口),只遞不歸會導(dǎo)致程序崩潰。
要得到n - 1的積直接調(diào)用 f(x) 這個函數(shù)就行了,完全不需要思考這個函數(shù)怎么執(zhí)行的。
一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法。I第一行輸入T,表示有多少個測試數(shù)據(jù)。接下來T行,每行輸入一個數(shù)n,表示臺階的階數(shù)。
輸出時每一行對應(yīng)一個輸出。
當(dāng)n > 2 時,如果走1級有多少種走法 + 如果走2級有多少種走法,就是n級臺階所有的走法。
int fun(int n) {
if (n == 1) {
return 1;
} else {
return n * fun(n - 1);
}
}
int fun(int n) {
int x = 1;
for (int i = 2; i <= n; i++) {
x *= i;
}
return x;
}
迭代與普通循環(huán)的區(qū)別是:迭代時,循環(huán)代碼中參與運(yùn)算的變量同時是保存結(jié)果的變量,當(dāng)前保存的結(jié)果作為下一次循環(huán)計算的初始值。
遞歸與普通循環(huán)的區(qū)別是:循環(huán)是有去無回,而遞歸則是有去有回(因?yàn)榇嬖诮K止條件)。
在循環(huán)的次數(shù)較大的時候,迭代的效率明顯高于遞歸。
迭代的方式有所不同,假如有個產(chǎn)品要求6個月交貨,我在第一個月就會拿出一個產(chǎn)品來,當(dāng)然,這個產(chǎn)品會很不完善,會有很多功能還沒有添加進(jìn)去,bug很多,還不穩(wěn)定,但客戶看了以后,會提出更詳細(xì)的修改意見,這樣,你就知道自己距離客戶的需求有多遠(yuǎn),我回家以后,再花一個月,在上個月所作的需求分析、框架設(shè)計、代碼、測試等等的基礎(chǔ)上,進(jìn)一步改進(jìn),又拿出一個更完善的產(chǎn)品來,給客戶看,讓他們提意見。
就這樣,我的產(chǎn)品在功能上、質(zhì)量上都能夠逐漸逼近客戶的要求,不會出現(xiàn)我花了大量心血后,直到最后發(fā)布之時才發(fā)現(xiàn)根本不是客戶要的東西的情況。
這個過程也很像打游戲,你剛開始玩,一下子就輸了,但是隨著你玩的次數(shù)越來越多,你的技藝就越來越精湛,而這個結(jié)果,不是你在開始玩游戲的時候,規(guī)劃出來的,而是在你玩的過程中,通過不斷的輸不斷的輸,練出來的。
所以,你能達(dá)成的結(jié)果,都是在你做的過程中,不斷試錯,不斷調(diào)整,不斷精進(jìn),最后自然而然得到的一個結(jié)果。
所以,我們不能把迭代簡單的理解為“升級”。
升級,更多描述的是一個結(jié)果,是一種直接的,一次性的,達(dá)成的一個目標(biāo),是一種線性的進(jìn)程。
而迭代,是通過無數(shù)次,不斷的,重復(fù)的,接近一個目標(biāo),折返接近,再折返再接近,最終達(dá)到目標(biāo)。它不是一次性完成的,是通過不斷重復(fù)的,但每次重復(fù)又比之前更好一點(diǎn),這樣一種非線性的進(jìn)程。
現(xiàn)在我們把“迭代”的關(guān)鍵詞拆解一下:
1.重復(fù):
不斷的重復(fù)做,而不是一次性的完成。
2.改進(jìn)
在做的過程中不斷的改進(jìn)、調(diào)整、優(yōu)化。
3.認(rèn)知升級
迭代的過程就是不斷提高認(rèn)知的過程,升級只是這個過程的一個結(jié)果。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。