遞迴與迭代

2021-08-13 08:09:26 字數 2235 閱讀 9013

遞迴是什麼?

簡單來說,就是函式自己調自己的一種方法。

通常可以把乙個大型複雜的問題轉化為乙個與原問題相似的規模較小的問題來求解。

遞迴的兩個必要條件:

以下用幾個例項來說明:

題目一:接受乙個無符號整數,把它轉化為字元並列印它。

void print(int n)

printf("%d ", n % 10);

}int main()

這個問題用遞迴的方法去思考,列印1234,實際上就是列印

1+(234)

1+2+(34)

1+2+3+(4)

題目二:不允許建立臨時變數,求字串的長度

int mystrlen(const

char* str)

}int main()

這道題的遞迴過程:

1+(bcd12345)

1+1+(cd12345)

1+1+1+(d12345)

…… 1+1+1+1+1+1+1+1+1

其實從這兩道題就可以看出,遞迴實際上就是不斷的縮小問題的規模的過程,在這個過程中,對問題的處理都採用類似的方法,直至將這個問題解決。並且,只要能將遞迴的過程想清楚,**篇幅是非常短的,可以說是遞迴的乙個優點。

接下來是另外兩個例子:

題目一:求n的階乘(不考慮溢位)

int fac(int n)

}int main()

同樣用遞迴的思路考慮將n!轉化為:n*(n-1)!,n*(n-1)*(n-2)!,……

題目二:求第n個斐波那契數(不考慮溢位)

int fib(int n)//遞迴寫法

else

}int main()

同樣也是用遞迴的方式去考慮這個問題,除了第乙個和第二個斐波那契數都是1之外,其他的數都是前兩個數之和。

但是我們可以思考一下,如果要求求第50個斐波那契數,就必須將前49個斐波那契數字全部求出,這個過程是非常消耗時間的,而且使用遞迴求解n的階乘時,如果求乙個非常大的數字的階乘,是會出現一些我們不可預知的錯誤的,可能會導致程式崩潰。

我們在vs2013下測試一下上面的程式,

int count = 0;

int fib(int n)//遞迴寫法

從圖上可以看出,我們只是計算了第37個斐波那契數,就將n=3呼叫了大概九百多萬次,在程式實際執行時大概等了2、3秒鐘。

原因是:

我們之前了解了棧幀的概念,函式呼叫的過程實際就是不斷建立棧幀的過程,而遞迴在不斷呼叫自己的過程中,也在不斷的建立棧幀,並且建立棧幀以及釋放棧幀都是需要耗費時間的,所以再用遞迴解決問題時,乙個重要的問題就是會耗費大量的時間。

除此之外,我們知道函式呼叫的過程中,臨時變數的建立都是在棧上的,而棧的記憶體是有限的,不會無止盡的供我們使用,一旦遞迴無止盡的遞迴時,很有可能導致一直開闢棧空間,直至空間耗盡的情況,這種情況成為棧溢位。

那麼該如何解決這個問題呢。

此時就需要用迭代的方式來解決。

迭代是什麼?

其實就是將大規模的問題用迴圈來解決

我們在上面兩個例子可以看出,遞迴雖然是可以將問題規模縮小化,但是非常容易出現錯誤,並且在某些情況下會很消耗時間,那麼我們考慮用迭代的方式來思考上面的例子。

//求第n個斐波那契數

int fib1(int n)//非遞迴

return nvalue;

}

//求n的階乘

int fac1(int n)

return

sum;

}

使用迭代的方式,在不考慮結果是否溢位的情況下,程式執行都是非常迅速的,原因是迴圈並沒有不斷的開闢棧空間並且執行函式呼叫的過程,所以迭代的第乙個優點就是速度快

遞迴:

迭代:

那麼我們該選擇迭代還是遞迴呢?

一般來說,遞迴能解決的問題迭代都可以解決。

能用迭代解決的優先考慮迭代,如果過程實在非常負責,並且用遞迴可以解決,再選擇遞迴。

遞迴與迭代

遞迴與迭代都是基於控制結構 迭代用重複結構,而遞迴用選擇結構。遞迴與迭代都涉及重複 迭代顯式使用重複結構,而遞迴通過重複函式呼叫實現重複。遞迴與迭代都涉及終止測試 迭代在迴圈條件失敗時終止,遞迴在遇到基本情況時終止。使用計數器控制重複的迭代和遞迴都逐漸到達終止點 迭代一直修改計數器,直到計數器值使迴...

遞迴與迭代

1 遞迴 當函式用自身來定義時就稱為是遞迴 recursive 的。遞迴必須滿足四個基本法則 1 基本情形 必須給出基準情況,不用遞迴就能求出,用於終止遞迴運算 2 不斷推進 對於那些要被遞迴求解的情形,遞迴呼叫必須能夠朝著乙個基準情形推進 3 設計法則 假設所有的遞迴呼叫都能執行 4 合成效益法則...

遞迴與迭代

遞迴的基本概念 程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己.乙個函式在其定義中直接或間接呼叫自身的一種方法,它通常把乙個大型的複雜的問題轉化為乙個與原問題相似的規模較小的問題來解決,可以極大的減少 量.遞迴的能力在於用有限的語句來定義物件的無限集合.使用遞迴要注意的有兩點 1 遞迴就是在...