優點:**表達力強,簡潔;
缺點:空間複雜度高,有堆疊溢位風險,存在重複計算可能,以及過多的函式呼叫會比較耗時;
乙個問題的解可以分解為幾個子問題的解;
例如 f(n)=f(n-1)+f(n-2);
這個問題與分解的子問題,除資料規模不同,求解思路完全一樣;
例如 f(n)=f(n-1)+f(n-2); n 、n-1 、 n-2只是資料不同但求解函式一樣都是f
存在遞迴終止條件;
例如 f(1)=1;
理解
寫出遞推公式,找到終止條件遞迴其實就是乙個方程式:f(n) = f(n-1) + a;也就是說在設計遞迴的時候應該考慮下面三個方面:
求解f(n)的時候,假設f(n-1)已經求解出來了。我們不要去考慮f(n-1)是如何求解出來的。關鍵點在於找到遞迴的終止條件。
遞迴往往和分治法是分不開的。對於複雜的遞迴,往往將遞迴拆分,然後再合併。 步驟
寫乙個遞迴方法。
首先寫判斷遞迴結束時候的操作;
再寫遞迴分解操作; 栗子
漢諾塔問題就是使用典型的遞迴思想。
先推導最簡單的f(2),從而推f(n)的解可以分為:
將 n-1 個圓盤從 from -> buffer
將 1 個圓盤從 from -> to
將 n-1 個圓盤從 buffer -> to
以上三步都是為了求解f(n),最後我們給出遞迴結束的條件。只有乙個圓盤的時候,只需一次移動操作即可from -> to。
/**
* 漢諾塔問題
*/public
static
void
move
(int n,string from,string buffer,string to)
move
(n-1
,from,to,buffer)
;move(1
,from,buffer,to)
;move
(n-1
,buffer,from,to)
;}
電影院問座位第幾排問題,f(n)=f(n-1)+1,f(1)=1,
/**
* 電影院座位排數問題
* @param n 前面一排
* @return
*/public
static
intask
(int n)
return
ask(n-1)
+1;}
1.警惕堆疊溢位:
遞迴用的是系統棧或者虛擬機器函式呼叫棧,棧空間一般都不大,
如果遞迴求解的資料規模很大,呼叫層次很深,一直壓入棧,就會有堆疊溢位的風險。
可以宣告乙個全域性變數來控制遞迴的深度,從而避免堆疊溢位。
2.警惕重複計算:
例如 f(n)=f(n-1)+f(n-2) , f(5)=(f4)+f(3),f(4)=f(3)+f(2),這裡f(3)重複計算
通過雜湊表來儲存已經求解過的值,從而避免重複計算。
有一種思念很幸福
有一種朋友,我想那是一種介乎於愛情與友情之間的感情,你會在偶爾的一時間默默地想念他,想起他時,心裡暖暖的,有乙份美好,有乙份感動。在憂愁和煩惱的時候,你會想起他,你很希望他能在你的身邊,給你安慰,給你理解,而你卻從沒有向他傾訴,你怕屬於自己的那份憂傷回妨礙他平靜的生活。你會因為一首歌曲,一種顏色,想...
思念是一種很玄的東東
有一種很玄的東東叫思念。思念是一種幸福的憂傷,是一種甜蜜的惆悵。思念是對昨日悠長的沉湎和未來美好的嚮往。思念是有距離的。沒有距離,便沒有思念。如果是空間的距離,那思念便是甜蜜的,甜蜜的笑著流淚。如果是心靈的距離,那思念便是苦澀的,苦澀的笑著流淚。如果是彼此的思念,那思念便是一種幸福。如果是單向的相思...
思念是一種很玄的東西
有一種很玄的東西叫思念。思念是一種幸福的憂傷,是一種甜蜜的惆悵。思念是對昨日悠長的沉湎和未來美好的嚮往。思念是有距離的。沒有距離,便沒有思念。如果是空間的距離,那思念便是甜蜜的,甜蜜的笑著流淚。如果是心靈的距離,那思念便是苦澀的,苦澀的笑著流淚。如果是彼此的思念,那思念便是一種幸福。如果是單向的相思...