迭代
更省性能,效率高
只更换房间内的物品
递归
更耗性能,效率低
占用很多房间,每个房间都放物品,直到进入了最后一道防线(设置的出口),然后再开始运算...
感受
看到很多人吹爆了递归,说这更贴近人的思维,是神一样的存在之类。所以才有了这篇随笔。
更贴近人的思维?你家的人的思维是拿到一道类似阶层、斐波那契数列的题目,是倒推到“原点”,然后再一个个计算出来吗?(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); }