1.
遞迴和迭代術語的定義是什麼?乙個函式可以同時採用這兩種方法嗎?答:
遞迴的定義
:將乙個大問題分解成比較小的、有著相同形式的問題。
迭代跟遞迴策略是相反的。它使用迴圈(一般情況下,使用
for和
while
語句)的實現被稱為迭代的。他們能夠通過截然不同的方式來解決乙個問題。然而,這些策略並不互相排斥。
2.遞迴和逐步求精法的根本區別是什麼?
答:「相同形式」是這個定義中的關鍵,否則就成了——逐步求精策略,兩種策略都涉及到分解。遞迴的特殊之處就在於子問題有著和初始問題相同的形式。3.在
collectcontributions
函式的偽**中,
if語句如下所示:
if (
n <= 100)使用
<=
運算子代替簡單地核對
n是否等於
100,為什麼很重要?
答:因為這行**只是將初始問題在乙個更小範圍內再現。這個任務的最基本的特徵——募集
n美圓一直保持著。如果大於
100美圓,那麼函式一直呼叫自身。這個呼叫自身的函式,這是遞迴的決定性特徵。
4.什麼是標準的遞迴正規化?
if(test for ****** case)else
該程式結構提供了乙個寫遞迴函式的模板,因此被稱為遞迴正規化。只要符合如下條件,就可以在程式設計技術中應用這一技術。
(1)必須能夠鑑別出乙個簡單情景,且該情景的答案是容易確定的。
(2)必須能夠確認出乙個遞迴的分解方式,能夠將問題的複雜例項分解為更小的、具有相同形式的問題。
5.要讓遞迴成為乙個解決,問題必須具備的兩個特性是什麼?(1
)必須能夠鑑別出乙個簡單情景,且該情景的答案是容易確定的。(2
)必須能夠確認出乙個遞迴的分解方式,能夠將問題的複雜例項分解為更小的、具有相同形式的問題。
6.為什麼說分而治之是遞迴技術最恰當的描述?
答:分而治之是遞迴技術的最恰當的體現,因為這句話說明了遞迴每個分解問題都需要分別對待,不能看做乙個整體。不然會很混亂。
7.對遞迴跳躍的信任是什麼意思?為什麼這個感念對程式設計師來說是很重要的?
答:當嘗試理解遞迴程式時,必須能夠拋開底層的細節,將注意力集中在單個計算層次上。在這個層次上,只要乙個遞迴呼叫的引數在某些方面能比前乙個蠶食更簡單,那麼就可以認為任何遞迴呼叫都能夠自動地得到正確的答案。這種心理策略——假設任何更簡單的遞迴都能正確地實現——叫做對遞迴跳躍的信任。在實際應用中,學習應用這個策略是使用遞迴的基礎,所以對程式設計師來說很重要!8.在
4.2.2
小節 「追蹤遞迴過程」中,對呼叫f
act(4)時程式如何執行進行了大篇幅的分析。把這種分析作為乙個模型,追蹤f
ib(4)的執行過程,劃出程序中的每乙個棧偵的略圖。
答:首先主函式
main
呼叫fact
時,計算機建立乙個新的棧楨並將引數數值複製到形參n。
fact
的棧楨臨時替代了
main
的棧楨
在該圖中,
fact
的主體**在偵內給出,這樣就更容易跟蹤這個程式執行的當前位置。該位置在圖中用箭頭標示出。在當前的圖中,箭頭出現在**的開頭,因為所有的函式呼叫都是從函式體的第一條語句開始。
現在,計算機開始執行函式體,從
if語句開始。因為
n不等於
0,所以繼續執行到
else
子句,在該句中,程式必須計算和返回下面表示式的值:
n*fact( n – 1 )
計算上面的表示式要求首先計算這個呼叫的結果和
n相乘。當前的結果用下圖所示:
只要對fact
(n-1
)的呼叫返回,那麼結果將代替圖中有下劃線的表示式,然後繼續執行下去。
下一偵應該是:
現在有2個偵都標記為
fact
。在最近的這個偵中,計算機開始計算
fact(3
)。在那先前的哪個被最近新建立的偵所掩蓋的偵中,
fact
函式等待著對
fact(1
)呼叫的返回值。
然而,必須執行當前的計算完成最高層偵。又一次判斷,n不是
0,所以控制流程轉向
if語句的
else
子句,在該語句中計算機必須計算出
fact(1
)。然而,在這個偵中
n的值為
3,所以要求的結果是通過呼叫
fact(2
)來計算。同前面一樣,這一流程要求建立乙個新的棧偵,如下所示:
同樣的邏輯,現在程式必須呼叫
fact(1
),而它又接著呼叫
fact(0
),因此建立了兩個新的棧偵。最終的結果偵結構如下所示:
然而在這一計算位置上,情況有所改變。因為
n的值為
0,所以函式能夠通過執行下列語句,立即返回結果:
return(1
);值1返回到呼叫者偵,該偵重新回到棧頂,如下所示:
從這一點,計算過程一層層返回遞迴呼叫,在每一層上完成返回值的計算。該偵中對
fact
(n * 1
); n
的值為1
,所以這個遞迴呼叫的結果為
1。這個結果被返回給它的呼叫者,該呼叫者可以使用如下偵表示:
因為n的值現在是
2,因此執行
return
語句使值
2傳回到前乙個偵中,如下所示:
在這個階段上,程式把
3x2的結果返回到前乙個偵中,這時初始對
fact
的呼叫偵變成了如下的形式:
計算過程的最後一步由計算4ⅹ
6並且把
24返回到主程式中兩部分組成。
9.引用成對的兔子在生下3胎後停止繁育這個規則,修改費波那契的兔子問題,這種假設是如何改變遞迴關係的?在簡單情景中,您需要做的改變是什麼?
答:這種假設把生育
3次的兔子除去,這樣我們可以再設一遞迴,只計算不生育的兔子,然後用以前那個總數減去現在不生育的這個就是現在生育的兔子個數。
10.在圖
4-1給出的遞迴實現中
,但計算
fid(n)
時呼叫了多少次
fid(1)?
答:呼叫了5次
fid(1)。
11.如果從函式
additivesequence
中將if(n==1)刪除,
程式如下:
static int additivesequence(int n, int t0, int t1)
將會發生什麼事情
?該函式還能工作嗎
?為什麼?
答:就會只返回
0別的不運算。該函式不能工作了,因為這個遞迴需要
3個引數才能進行運算,少乙個引數就不能進行遞迴運算了。
12.
什麼是包裝器函式
?為什麼它們在寫遞迴程式時用處很大?
13.
在圖4-3
的ispalindrome
實現中,
為什麼對空字串的校驗和對單字元的校驗同樣重要
?如果不對單字元情景進行校驗
,而是僅僅對長度為
0的情形進行校驗
,將會發生什麼
?這個還能夠正確執行嗎?
答:這樣不能正確顯示所有結果,像
noon
形式的可以正確顯示,但是
level
形的就顯示不了。
所以就會產生片面的情況。
14.
解釋圖4-4
中給出的函式
ispalindrome
實現中函式呼叫
checkpalindrome(str+1, len-2)
的作用.
答:在c語言中,陣列總是被當作指定它的第乙個元素的指標。如果給其位址加
1,那麼按照
c語言的規則會返回乙個在第乙個元素之後的元素位址。因此呼叫這個函式會使指標開始於第
2個字元,而比
str原始值早結束乙個字元。
15.
什麼是互動遞迴?
答:如果函式
f呼叫函式
g,而函式
g又反過來呼叫函式
f,這些函式的呼叫仍然被看作是遞迴的。因為函式f和
g互相呼叫,這種型別的遞迴被稱為互動遞迴。
16.
如果按下面的方式定義了
iseven
和isodd:
bool iseven(unsigned n)
bool isodd (unsigned n)
將會發生什麼?
答:會產生無限遞迴。
17.下面對
iseven
和isodd
的定義也是不正確的:
bool iseven(unsigned n)
else}
bool isodd(unsigned n)
else
}給出乙個演示這個實現是如何失敗的示例
.在這裡示範的是什麼常見錯誤?
這個只能判斷0和
1,別的無法判斷。
這個示範的是弄錯了簡單的情景定義,實現策略時出現問題。
遞迴和迭代 迭代與遞迴
很多程式設計小白都會遇到 迭代 和 遞迴 的問題 包括我自己 大部分同學還是不知道迭代與遞迴的區別。下面我就嘗試用最通俗易懂的模式講解遞迴與迭代的區別。1.迭代 迭代其實很簡單,我們在程式設計中經常用到迭代。比如說 i 1 print i 這個就是乙個迭代,沒想到吧。迭代的意思其實就是在迴圈 現了參...
遞迴和迭代
遞迴和迭代是兩種常用的演算法,很多人知道怎麼寫遞迴和迭代,但是不知道什麼時候該用遞迴,什麼時候該用迭代。下面的 分別通過使用遞迴和迭代計算fibonacci數列,可以很清楚的看到效率的驚人差別。當然,很難有個準則說什麼時候該用遞迴,什麼時候該用迭代,但有乙個很簡單的判斷方法 如果你的遞迴呼叫是在函式...
遞迴和迭代
分享自 酷勤網 www.kuqin.com 遞迴函式 遞迴可以描述不同的概念,如果說乙個函式是遞迴的,那麼就是說函式的定義中 直接或者間接地 引用了該函式本身。比如求斐波那契數列,使用swift實現 func fib n int intreturn fib n 1 fib n 2 從函式定義看,fi...