迭代
更省性能,效率高
只更換房間內的物品
遞歸
更耗性能,效率低
占用很多房間,每個房間都放物品,直到進入了最后一道防線(設置的出口),然后再開始運算...
感受
看到很多人吹爆了遞歸,說這更貼近人的思維,是神一樣的存在之類。所以才有了這篇隨筆。
更貼近人的思維?你家的人的思維是拿到一道類似階層、斐波那契數列的題目,是倒推到“原點”,然后再一個個計算出來嗎?(are u kidding me?)
你中學的數學題,難道不是用迭代的思維寫的解題過程?
以此類推,遞歸更加貼近人的思維的說法根本站不住腳,只是你習慣了遞歸的簡潔寫法,哪怕代價是忽略了性能而已。——如果你喜歡遞歸而非迭代,那么你可能很少動腦了。
知道自己想要寫的是什么效果,那么迭代和遞歸,對我們來說都一樣的。
如果是我,我寫迭代的時候比寫遞歸的時候順一點,因為我可能會忘了設置出口,調試的時候才發現好像有什么不對... 當然,這也和我很少寫遞歸有關。
最后,我想說的是,代碼的藝術,是用更少的代碼,寫更多的功能的同時,也是用更有限的性能,寫出更多的功能。追求性能極致是很酷的一件事。——尤其在思維而非語言的時候。
例子
階層和斐波那契數列
/* 迭代 n的階層 */ function f(n){ if(0===n) return 0; let z=1; for(let i=1; i<=n; i++){ z *= i; } return z; }; /* 迭代 斐波那契數列 */ function d(n){ if(1===n || 2===n) return 1; if(n<=0) return; let z =1; let x =1; for(let i=3; i<=n;i++){ z +=x; x = z-x; } return z; } /* 遞歸 n的階層 */ function f2(n){ if(1===n) return 1; return n*f2(n-1); }; /* 遞歸 斐波那契數列 */ function d2(n){ if(1===n || 2===n) return 1; return d2(n-1) + d2(n-2); }