在計算機程式設計的道路上,決心修行時,第乙個想到的起點卻是遞迴,也許這就是程式設計思想的一種默契。
遞迴是程式設計中乙個強有力的工具,但是大多數人不會自然而然地想到遞迴。遞迴可以方便我們解決某些問題,我們需要考慮在哪些情況下使用遞迴。乙個問題要採用遞迴遞迴方法來解決問題時,必須符合以下3個條件。
(1)解決問題時,可以把乙個問題轉化成為乙個新的問題,而這個新的問題的解決方法仍與原問題的解法相同,只是處理的物件不同,這些處理的物件之間是有規律的遞增或遞減的;
(2)可以通過轉化過程使問題得到簡化;
(3)必定要有乙個明確的結束遞迴的條件,否則遞迴將會無止境地進行下去,直到耗盡系統資源。也就是說必須要有某個終止遞迴的條件。
如階乘問題,求n的階乘(n!),可以轉化為n(n-1)!;而要求n(n-1)!又可以轉化為(n-1)((n-2)!;……;這裡面都 有乙個數乘以另乙個數的階乘問題,被處理的物件分別是n,n-1,……,是有規律的遞減。但是我們不能讓程式無止境地執行下去,必須給乙個結束條件。該問題恰好有乙個結束條件,即當n=0時,0!=1。
有兩種情況常用到遞迴方法:
(1)定義是遞迴的。
(2)問題的解法是遞迴的。
階乘函式的定義採用的就是遞迴方法。如
1 , n=0(遞迴終止條件)
n!={
n(n-1) , n>0(遞迴步驟)
演算法:public long fact(long n){
if(n==0) return 1;
else return n*fact(n-1);
遞迴模型反映乙個遞迴問題的遞迴結構,例如:
(1)f
(0)=1;
(2)f(n)=n*f
(n-1) n>0;
公式(1)給出了遞迴的終止條件,公式(2)給出了f
(n)的值與f
(n-1)的值的關係,我們把(1)式稱為遞迴出中,(2)式稱為遞迴體。
一般地,乙個遞迴模型是由遞迴出口和遞迴體兩部分組成,前者確定遞迴到何時為止,後者確定遞迴的方式。
遞迴出中的一般格式為:f
(s(0)
)=m(0);(這裡s(0)和m(0)為常量)
遞迴體的一般格式為:f
(s)=g(f
(s(1)),
f(s(2)),...,
f(s(n)),c(1),c(2),...,c(m))(這裡的s是乙個遞迴的「大問題」,s(1),s(2),...,s(n)是遞迴的「小問題」,c(1),c(2),...,c(m)是若干個可以直接使用非遞迴方法就可以解決的問題)
VO DTO與領域模型的概念
業務物件模型 也叫領域模型 domain model 是描述業務用例實現的物件模型。它是對業務角色和業務實體之間應該如何聯絡和協作以執行業務的一種抽象。業務物件模型從業務角色內部的觀點定義了業務用例。該模型為產生預期效果確定了業務人員以及他們處理和使用的物件 業務類和物件 之間應該具有的靜態和動態關...
Java 遞迴概念與實戰
本文主要介紹的遞迴演算法。構成遞迴需具備的條件 1 子問題須與原始問題為同樣的事,且更為簡單 簡單點理解類似 累加或者累乘 2 不能無限制地呼叫本身,須有個出口,化簡為非遞迴狀況處理。也就是需要將結果返回出去,無限的自己呼叫自己沒有意義,因為演算法的本質是為了提高效率 九九乘法表 對於大多數人來說九...
演算法分析與設計 遞迴與尾遞迴
什麼是遞迴?遞迴最恰當的比喻,就是查詞典。我們使用的詞典,本身就是遞迴,為了解釋乙個詞,需要使用更多的詞。當你查乙個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裡仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有乙個詞的解釋是你完全能看懂的,那麼遞迴走到了盡頭,然後你...