要不要重新认识一下递归与迭代?
最近在学习新加坡国立大学出品的 SICP JS 适配版。学到一个非常有意思的基础概念区分:递归与迭代。
但凡有过编程经验的同学,都不会觉得自己不知道递归与迭代:递归就是自己调自己,迭代就是 for 或 while 嘛,很简单的事。
但这其实只是表面。
下面让我们重新认识一下递归和迭代,建立一点更深入的理解。
不废话,直接代码说话。
以阶乘问题 fact(4) 为例。递归:
以上代码计算 fact(4) 时产生的计算过程:
下面看迭代:
计算 fact(4) 时产生的计算过程:
我们并没有使用 for 或者 while,也同样写出了迭代代码。是的,有些同学可能看出来了,这个迭代代码,其实就是我们通常所说的尾递归。而我们也知道,之所以叫尾递归,是因为尾递归代码可以被编译器优化为迭代。
是的,迭代和递归,指的是计算过程的展开形式,而非函数自我调用或者 for, while 的区别。
最后,我贴一个指数快速计算的对比代码,感兴趣的同学,可以自己手绘一下计算过程的图示,感知一下递归和迭代的区别。
版权声明: 本文为 InfoQ 作者【西了意】的原创文章。
原文链接:【http://xie.infoq.cn/article/1acb29efe5455b6d0ee211a58】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论