生活随笔
收集整理的這篇文章主要介紹了
一些基本算法的递归实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問題描述:
遞歸是計(jì)算機(jī)科學(xué)中最偉大的思想。按照我的理解,所謂遞歸就是把問題化約為比自身維度更小的問題,直至邊界點(diǎn)(base condition),
然后利用邊界點(diǎn)的解的結(jié)果(相對(duì)容易得到)和一定規(guī)則回退得到最終所需要的結(jié)果。
? ? ? ? 常用到的遞歸思想的可歸類為:
1. 各種tree construct 的操作:遍歷(inorder, preorder, postorder),深度優(yōu)先搜索(dfs),廣度優(yōu)先搜索(bfs),插入,刪除,返回最值等;
? ? ? ? 2. 各種搜索問題最終都能化約為遞歸問題。比如八皇后,排列,組合,背包等等;
3. 下面我嘗試用遞歸思想實(shí)現(xiàn)一些平時(shí)最常用的操作(比如加法,乘法等):
代碼如下:
[cpp]?view plaincopy
int?max(?int?a,?int??b?)?? {?? ????if(?a??>?b?)?? ????????return?a;?? ?????? ????return?b;?? }?? ?? int?min(?int?a,?int?b?)?? {?? ????if(?a?<?b?)?? ????????return?a;?? ?????? ????return?b;?? }?? ?? int?Add(?int?m,?int?n?)?? {?? ????if(?0?==?n?)?? ????????return?0;?? ?????? ????return?Add(?m?+?1,?n?-?1);?? }?? ?? int?Mutiple(?int?m,?int?n?)?? {?? ????if(?1?==?n?)?? ????{?? ????????return?m;?? ????}?? ?????? ????return?Mutiple(?m?+?m,?n?-?1?)?? }?? ?? int?Subtract(?int?m,?int?n?)?? {?? ????if(?0?==?n?)?? ????{?? ????????return?0;?? ????}?? ?????? ????return?Subtract(?m?-?1,?n?-?1?);?? }?? ?? int?findMax(?int*?items,?int?idx,?int?size?)?? {?? ????if(?idx?==?size?-?1)?? ????????return?items[idx];?? ?????? ????return?max(??findMax(?items,?idx?+?1,?size?),?items[idx]?);?? }?? ?? int?findMin(?int*?items,?int?idx,?int?size?)?? {?? ????if(?idx?==?size?-?1?)?? ????????return?items[idx];?? ?????? ????return?min(?findMin(?items,?idx?+?1,?size?),?items[idx]?);?? }?? ?? int?Search(?int*?items,?int?idx,?int?size,?int?val?)?? {?? ????if(?idx?>=?size?)?? ????????return?-1;?? ?????? ????if(?items[idx]?==?val?)?? ????????return?idx;?? ?????? ????return?Search(?items,?idx?+?1,?size,?val?);?? }?? ?? int?BinarySearch(?int*?items,?int?begin,?int?end,?int?val?)?? {?? ????if(?begin?>?end?)?? ????????return?-1;?? ?????? ????int?mid?=?begin?+?(?(?end?-?begin?)?>>?1?);?? ????if(?items[mid]?>?val?)?? ????{?? ????????return?BinarySearch(?items,?begin,?mid?-?1,?val?);?? ????}?? ????else?if(?items[mi]?<?val?)?? ????{?? ????????return?BinarySearch(?items,?mid?+?1,?end,?val?);?? ????}?? ????else?? ????{?? ????????return?mid;?? ????}?? }?? ?? int?gcd(?int?n,?int?m?)?? {?? ????if(?0?==?m?)?? ????????return?n;?? ?????? ????return?gcd(?m,?n?%?m?);?? }?? ?? int?fibonical(?int?n?)?? {?? ????if(?1??==?n?)?? ????????return?1;?? ?????? ????return?fibonical(?n?-?1?)?+?fibonical(?n?-?2?);?? }?? ?? int?fictional(?int?n?)?? {?? ????if(?1?==?n?)?? ????????return?n;?? ?????? ????return?n?*?fictional(?n?-?1?);?? }?? ?? unsigned?int?power(?int?n,?int?m?)?? {?? ????if(?1?==?m?)?? ????????return?n;?? ?????? ????return?power(?n?*?m,?m?-?1?);?? }?? ?? ?? unsigned?int?powerQuick(?int?n,?int?m?)?? {?? ????if(?1?==?m?)?? ????????return?n;?? ?????? ????unsigned?int?k?=?powerQuick(?n,?m?/?2?);?? ?????? ????if(?0?==?m?%?2?)?? ????{?? ????????return?k?*?k;?? ????}?? ????else?? ????{?? ????????return?k?*?k?*?powerQuick(?n,?1?);?? ????}?? ?????? }?? ?? ?? ?? unsigned?int?Fib(?int?n,?unsigned?int?a,?unsigned?int?b?)?? {?? ????if(?1?==?n?)?? ????????return?b;?? ?????? ????return?Fib(?n?-?1,?b,?a?+?b?);?? }?? ?? ?? void?EulerLetter(?int?n,?int?depth,?int*?result?)?? {?? ????if(?depth?==?n?)?? ????{?? ????????for(?int?i?=?0;?i?<?dpeth;?i++?)?? ????????{?? ????????????printf(?"%d?",?result[i]?);?? ????????}?? ?????????? ????????printf(?"\n"?);?? ?????? ????????return;?? ????}?? ?????? ?????? ????for(?int?i?=?0;?i?<?n;?i++?)?? ????{?? ????????if(?depth?!=?i?)?? ????????{?? ????????????result[depth]?=?i;?? ????????????EulerLetter(?n,?depth?+?1,?result?);?? ????????}?? ????}?? } ?
總結(jié)
以上是生活随笔為你收集整理的一些基本算法的递归实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。