什麼情況下用遞迴?

2021-06-06 03:53:16 字數 864 閱讀 3799

遞迴的特點,可以看出遞迴可以大大縮短程式的**,有意識的使用遞迴,可以用較短的**解決一些複雜的問題。甚至有些問題非得使用遞迴解決不可。那麼什麼時候我們該使用遞迴呢?

遞迴演算法的

基本思想

是:把規模大的、較難解決的問題變成規模較小的、易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。 

乙個問題要採用遞迴方法來解決時,必須符合以下三個條件:

1.解決問題時,可以把乙個問題轉化為乙個新的問題,而這個新的問題的解決方法仍與原問題的解法相同,只是所處理的物件有所不同,這些被處理的物件之間是有規律的遞增或遞減;

2.可以通過轉化過程是問題得到解決;

3.必定要有乙個明確的結束遞迴的條件,否則遞迴將會無止境地進行下去,直到耗盡系統資源。也就是說必須要某個終止遞迴的條件。如求階乘問題,我們要求n的階乘(n!),可以把這個問題轉化為n*(n-1)!,而要求(n-1)!又可轉化為(n-1)*(n-2)!,……,這裡面都有乙個乙個數乘以另乙個數階乘的問題,被處理的物件分別是n,n-1,……,是有規律的遞減。但是我們不能讓程式無休止的乘下去,必須要給他乙個結束條件,該問題恰好有乙個結束條件,那就是當n=0時,0!=1。

遞迴與迴圈是兩種不同的解決問題的典型思路。 

遞迴演算法:

優點:**簡潔、清晰,並且容易驗證正確性。

缺點:它的執行需要較多次數的函式呼叫,如果呼叫層數比較深,每次都要建立新的變數,需要增加額外的堆疊處理,會對執行效率有一定影響,占用過多的記憶體資源。

迴圈演算法:

優點:速度快,結構簡單。

缺點:並不能解決所有的問題。有的問題適合使用遞迴而不是迴圈。如果使用迴圈並不困難的話,最好使用迴圈。

什麼情況下用retain和copy

那上面的是什麼意思呢?copy其實是建立了乙個相同的物件,而retain不是 比如乙個nsarray物件,位址為11111,內容為xx copy到另外乙個nsarray之 後,位址為22222,內容相同,新的物件retain為1,舊有物件沒有變化 retain到另外乙個nsarray之 後,位址相同...

layoutSubviews在什麼情況下呼叫

1.在以下情況都會呼叫 注意 當view的size的值為0的時候,addsubview也不會呼叫layoutsubviews。當要給這個view新增子控制項的時候不管他的size有沒有值都會呼叫 2.先來看一下uiview的layoutsubviews在什麼情況下會呼叫 subview view s...

socket什麼情況下可讀

一 下列四個條件中的任何乙個滿足時,socket準備好讀 1.socket接收緩衝區中已經接收的資料的位元組數大於等於socket接收緩衝區低潮限度的當前值 對這樣的socket的讀操作不會阻塞,並返回乙個大於0的值 即 準備好讀入的資料的位元組數 我們可以用socket選項so rcvlowat來...