while
循环比 for
循环的自由度更高。
每一次嵌套都是一次“升维”
-
迭代:“自下而上”地解决问题。从最基础的步骤开始,然后不断重复或累加这些步骤,直到任务完成。
-
递归:“自上而下”地解决问题。将原问题分解为更小的子问题,这些子问题和原问题具有相同的形式。接下来将子问题继续分解为更小的子问题,直到基本情况时停止(基本情况的解是已知的)。
-
函数的上下文数据都存储在称为“栈帧空间”的内存区域中,直至函数返回后才会被释放。因此,递归通常比迭代更加耗费内存空间。
-
递归调用函数会产生额外的开销。因此递归通常比循环的时间效率更低。
-
普通递归:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。
-
尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。
在函数内递归调用了两个函数,这意味着从一个调用产生了两个调用分支。如图 2-6 所示,这样不断递归调用下去,最终将产生一棵层数为 的递归树(recursion tree)。
两种工作机制与栈的“先入后出”原则异曲同工。