2018-03-08 迭代與遞歸

昨天在群里看到有群友在討論迭代與遞歸的區(qū)別,仔細檢索了下大腦,好像真的記不清了台妆,有些慚愧...。有空搜索下了胖翰,終于知道了它們的區(qū)別频丘。以下概念內容參考于銘毅天下的博文

遞歸的基本概念:程序調用自身的編程技巧稱為遞歸,是函數(shù)自己調用自己泡态。

一個函數(shù)在其定義中直接或間接調用自身的一種方法。它通常把一個大型的復雜的問題轉化為一個與原問題相似的規(guī)模較小的問題來解決迂卢,可以極大的減少代碼量某弦。遞歸的能力在于用有限的語句來定義對象的無限集合桐汤。

使用遞歸時需要注意的兩點:

1.遞歸就是在過程或函數(shù)里面調用自身;

2.在使用遞歸時,必須有一個明確的遞歸結束條件靶壮,稱為遞歸出口怔毛,從而避免方法出現(xiàn)死循環(huán)。

使用遞歸能解決一些經典問題腾降,例如拣度,斐波那契數(shù)列為:0,1,1,2,3,5...,從n到m的階乘等螃壤。

迭代:利用變量的原值推算出變量的一個新值抗果,通過重復一定的算法,達到想要的目的奸晴。迭代就是A不停的調用B冤馏,得到結果。

迭代一般的代碼形式是循環(huán)結構寄啼,for循環(huán)逮光,while循環(huán)等。而遞歸的代碼結構是選擇結構墩划。

遞歸的優(yōu)點是:代碼量極小涕刚,簡潔,可讀性好乙帮;缺點是:遞歸調用函數(shù)杜漠,浪費函數(shù)棧空間蚣旱,并且遞歸太深容易造成堆棧的溢出碑幅。

迭代的優(yōu)點有:迭代效率高,沒有額外的空間消耗塞绿;缺點是:代碼不簡潔沟涨,編寫復雜問題時代碼臃腫。

代碼技術不能只看理論异吻,光說不練假把式裹赴。所以我寫了幾段代碼來驗證下,紙上說的與實際代碼效果是否相符诀浪。

先來看看迭代的方式


- (void)test1 {

    //使用迭代的方法棋返,也就是使用for循環(huán)

    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

    NSUIntegersum = 0;

    for(int i = 0; i <= count; i++) {

        sum = sum + i;

    }

    CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();

    NSLog(@"sum=%ld, time cost:%f ms", sum, (endTime - startTime)*1000);

}

這里的count我依次設置了三次值10000,100000雷猪,1000000睛竣,每次也連續(xù)執(zhí)行3次,看其平均值求摇。
當count為10000時射沟,代碼連續(xù)執(zhí)行3次殊者,打印如下

2018-03-08 15:11:24.833246+0800 Test[947:45941] sum=50005000, time cost:0.038028 ms
2018-03-08 15:11:25.945530+0800 Test[947:45941] sum=50005000, time cost:0.036001 ms
2018-03-08 15:11:26.962520+0800 Test[947:45941] sum=50005000, time cost:0.036001 ms

我們再來看看遞歸的實現(xiàn)方式

- (void)test2 {
    //使用遞歸的方法
    CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();
    
    NSUInteger sum = [self addNumberToN:count];
    
    CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();
    NSLog(@"sum=%ld, time cost:%f ms", sum, (endTime - startTime)*1000);
}

- (NSUInteger )addNumberToN:(NSUInteger )n {
    if (n == 0) {
        return 0;
    }
    else {
        return n + [self addNumberToN:(n-1)];
    }
}

當count為10000時,代碼連續(xù)執(zhí)行3次验夯,打印如下

2018-03-08 15:16:20.969425+0800 Test[963:47741] sum=50005000, time cost:0.447035 ms
2018-03-08 15:16:21.898042+0800 Test[963:47741] sum=50005000, time cost:0.156045 ms
2018-03-08 15:16:23.362979+0800 Test[963:47741] sum=50005000, time cost:0.183940 ms

從上面可以看出猖吴,計算從1到10000的累加之和,循環(huán)迭代的時間消耗比方法遞歸調用要快一個數(shù)量級挥转,并且循環(huán)迭代多次調用的時間消耗相對比較平均海蔽,穩(wěn)定性高。方法遞歸的情況下绑谣,多次調用党窜,第一次耗時最長,之后趨于平均域仇。

之后刑然,我繼續(xù)嘗試了count的值為100000,1000000的情況暇务。
循環(huán)迭代的打印如下
count=100000

2018-03-08 15:27:27.733217+0800 Test[989:51140] sum=5000050000, time cost:0.359058 ms
2018-03-08 15:27:28.909848+0800 Test[989:51140] sum=5000050000, time cost:0.359058 ms
2018-03-08 15:27:30.006191+0800 Test[989:51140] sum=5000050000, time cost:0.316978 ms

count=1000000

2018-03-08 15:28:48.569061+0800 Test[1006:51953] sum=500000500000, time cost:3.015041 ms
2018-03-08 15:28:49.553860+0800 Test[1006:51953] sum=500000500000, time cost:3.122926 ms
2018-03-08 15:28:50.474250+0800 Test[1006:51953] sum=500000500000, time cost:3.030062 ms

方法遞歸的打印如下
count=100000

2018-03-08 15:30:46.876513+0800 Test[1028:53026] sum=5000050000, time cost:4.575968 ms
2018-03-08 15:30:48.066177+0800 Test[1028:53026] sum=5000050000, time cost:1.581073 ms
2018-03-08 15:30:49.620131+0800 Test[1028:53026] sum=5000050000, time cost:2.056003 ms

count=1000000
運行崩潰泼掠,如下圖


屏幕快照 2018-03-07 下午5.18.45.png

可以看到,app的方法棧堆積到了13萬多次垦细,應該是達到iOS系統(tǒng)允許app方法棧數(shù)量的極限择镇,app崩潰。

以上可以看出括改,雖然遞歸代碼簡潔腻豌、可讀性好,但是迭代效率高嘱能,空間消耗小吝梅,時間消耗也比遞歸快一個數(shù)量級。因此惹骂,在我們的日常開發(fā)中還是能用迭代就不用遞歸苏携。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市对粪,隨后出現(xiàn)的幾起案子右冻,更是在濱河造成了極大的恐慌,老刑警劉巖著拭,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纱扭,死亡現(xiàn)場離奇詭異,居然都是意外死亡儡遮,警方通過查閱死者的電腦和手機乳蛾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屡久,你說我怎么就攤上這事忆首。” “怎么了被环?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長详幽。 經常有香客問我筛欢,道長,這世上最難降的妖魔是什么唇聘? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任版姑,我火速辦了婚禮,結果婚禮上迟郎,老公的妹妹穿的比我還像新娘剥险。我一直安慰自己,他們只是感情好宪肖,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布表制。 她就那樣靜靜地躺著,像睡著了一般控乾。 火紅的嫁衣襯著肌膚如雪么介。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天蜕衡,我揣著相機與錄音壤短,去河邊找鬼。 笑死慨仿,一個胖子當著我的面吹牛久脯,可吹牛的內容都是我干的。 我是一名探鬼主播镰吆,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帘撰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鼎姊?” 一聲冷哼從身側響起骡和,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎相寇,沒想到半個月后慰于,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡唤衫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年婆赠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡休里,死狀恐怖蛆挫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情妙黍,我是刑警寧澤悴侵,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拭嫁,受9級特大地震影響可免,放射性物質發(fā)生泄漏。R本人自食惡果不足惜做粤,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一浇借、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怕品,春花似錦妇垢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迎罗,卻和暖如春睬愤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纹安。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工尤辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厢岂。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓光督,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塔粒。 傳聞我的和親對象是個殘疾皇子结借,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容